<!--
@license
Copyright (C) 2017 The Android Open Source Project

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.
-->

<script>
(function(window) {
  'use strict';

  window.Gerrit = window.Gerrit || {};

  /** @polymerBehavior Gerrit.AccessBehavior */
  Gerrit.AccessBehavior = {
    properties: {
      permissionValues: {
        type: Object,
        readOnly: true,
        value: {
          abandon: {
            id: 'abandon',
            name: 'Abandon',
          },
          addPatchSet: {
            id: 'addPatchSet',
            name: 'Add Patch Set',
          },
          create: {
            id: 'create',
            name: 'Create Reference',
          },
          createTag: {
            id: 'createTag',
            name: 'Create Annotated Tag',
          },
          createSignedTag: {
            id: 'createSignedTag',
            name: 'Create Signed Tag',
          },
          delete: {
            id: 'delete',
            name: 'Delete Reference',
          },
          deleteChanges: {
            id: 'deleteChanges',
            name: 'Delete Changes',
          },
          deleteOwnChanges: {
            id: 'deleteOwnChanges',
            name: 'Delete Own Changes',
          },
          editAssignee: {
            id: 'editAssignee',
            name: 'Edit Assignee',
          },
          editHashtags: {
            id: 'editHashtags',
            name: 'Edit Hashtags',
          },
          editTopicName: {
            id: 'editTopicName',
            name: 'Edit Topic Name',
          },
          forgeAuthor: {
            id: 'forgeAuthor',
            name: 'Forge Author Identity',
          },
          forgeCommitter: {
            id: 'forgeCommitter',
            name: 'Forge Committer Identity',
          },
          forgeServerAsCommitter: {
            id: 'forgeServerAsCommitter',
            name: 'Forge Server Identity',
          },
          owner: {
            id: 'owner',
            name: 'Owner',
          },
          publishDrafts: {
            id: 'publishDrafts',
            name: 'Publish Drafts',
          },
          push: {
            id: 'push',
            name: 'Push',
          },
          pushMerge: {
            id: 'pushMerge',
            name: 'Push Merge Commit',
          },
          read: {
            id: 'read',
            name: 'Read',
          },
          rebase: {
            id: 'rebase',
            name: 'Rebase',
          },
          removeReviewer: {
            id: 'removeReviewer',
            name: 'Remove Reviewer',
          },
          submit: {
            id: 'submit',
            name: 'Submit',
          },
          submitAs: {
            id: 'submitAs',
            name: 'Submit (On Behalf Of)',
          },
          toggleWipState: {
            id: 'toggleWipState',
            name: 'Toggle Work In Progress State',
          },
          viewPrivateChanges: {
            id: 'viewPrivateChanges',
            name: 'View Private Changes',
          },
        },
      },
    },

    /**
     * @param {!Object} obj
     * @return {!Array} returns a sorted array sorted by the id of the original
     *    object.
     */
    toSortedArray(obj) {
      if (!obj) { return []; }
      return Object.keys(obj).map(key => {
        return {
          id: key,
          value: obj[key],
        };
      }).sort((a, b) => {
        // Since IDs are strings, use localeCompare.
        return a.id.localeCompare(b.id);
      });
    },
  };
})(window);
</script>
