{"version":3,"file":"sortable.cjs","sources":["../../../../packages/components/src/subject/sortable.ts"],"sourcesContent":["import type { SubjectLikeItem } from './pagination'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport Sortable, { type SortableEvent, type SortableInstance } from 'sortablejs'\nimport { safeCustomElement } from '../base/define'\nimport { moveSubjectItem, reorderSubjects } from './sort-controller'\nimport { subjectHostStyles } from './shared-styles'\nimport { SubjectTypeLabel } from './types'\n\n@safeCustomElement('qxs-subject-sortable')\nexport class QxsSubjectSortable extends LitElement {\n  static styles = [subjectHostStyles, css`\n    :host { font-size: 13px; }\n    *, ::before, ::after { box-sizing: border-box; }\n    .sort-list { display: flex; flex-direction: column; gap: 10px; }\n    .sort-item {\n      display: flex; align-items: center; gap: 12px;\n      padding: 12px 14px; background: var(--qxs-subject-fill-blank, #fff); border: 1px solid var(--qxs-subject-border-light, #e4e7ed); border-radius: 10px;\n      cursor: grab; transition: all .2s;\n    }\n    .sort-item:hover { border-color: var(--qxs-subject-fill-soft-primary-border-strong, #bfd1ff); background: var(--qxs-subject-fill-soft-primary-hover, #f8fbff); }\n    .sort-item.sort-ghost { opacity: .5; background: var(--qxs-subject-fill-soft-primary, #ecf5ff); }\n    .sort-item.sort-chosen { border-color: var(--qxs-subject-color-primary, #3D61E3); box-shadow: var(--qxs-subject-shadow-primary, 0 8px 20px rgba(61,97,227,.12)); }\n    .handle { color: var(--qxs-subject-text-secondary, #909399); font-size: 16px; user-select: none; }\n    .content { flex: 1; min-width: 0; }\n    .title { font-size: 13px; color: var(--qxs-subject-text-primary, #303133); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .meta { margin-top: 4px; font-size: 12px; color: var(--qxs-subject-text-secondary, #909399); }\n  `]\n\n  @property({ type: Array }) items: SubjectLikeItem[] = []\n  @property({ type: Object, attribute: 'label-renderer' }) 'label-renderer'?: (item: SubjectLikeItem, index: number) => string\n\n  @state() private _items: SubjectLikeItem[] = []\n  private _sortable: SortableInstance | null = null\n\n  willUpdate(changed: Map<string, unknown>) {\n    if (changed.has('items')) {\n      this._items = Array.isArray(this.items) ? this.items.map(item => ({ ...item })) : []\n    }\n  }\n\n  firstUpdated() {\n    this._initSortable()\n  }\n\n  updated(changed: Map<string, unknown>) {\n    if (changed.has('_items')) {\n      this._sortable?.destroy()\n      this._sortable = null\n      this.updateComplete.then(() => this._initSortable())\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this._sortable?.destroy()\n    this._sortable = null\n  }\n\n  reorderByIds(orderedIds: string[]) {\n    this._items = reorderSubjects(this._items, orderedIds)\n    this._emitSortChange()\n  }\n\n  private _initSortable() {\n    const list = this.renderRoot.querySelector<HTMLElement>('.sort-list')\n    if (!list) {\n      return\n    }\n    this._sortable = Sortable.create(list, {\n      handle: '.handle',\n      animation: 180,\n      ghostClass: 'sort-ghost',\n      chosenClass: 'sort-chosen',\n      onEnd: (event: SortableEvent) => {\n        const { oldIndex, newIndex } = event\n        if (oldIndex == null || newIndex == null || oldIndex === newIndex) {\n          return\n        }\n        this._items = moveSubjectItem(this._items, oldIndex, newIndex)\n        this._emitSortChange(oldIndex, newIndex)\n      },\n    })\n  }\n\n  private _emitSortChange(oldIndex?: number, newIndex?: number) {\n    this.dispatchEvent(new CustomEvent('sort-change', {\n      bubbles: true,\n      composed: true,\n      detail: {\n        items: this._items.map(item => ({ ...item })),\n        newIndex,\n        oldIndex,\n        orderedIds: this._items.map(item => String(item.customId || '')).filter(Boolean),\n      },\n    }))\n  }\n\n  private _label(item: SubjectLikeItem, index: number) {\n    if (typeof this['label-renderer'] === 'function') {\n      return this['label-renderer'](item, index)\n    }\n    return item.title || `未命名${SubjectTypeLabel[item.answerType] || '题目'}`\n  }\n\n  render() {\n    return html`\n      <div class=\"sort-list\">\n        ${this._items.map((item, index) => html`\n          <div class=\"sort-item\" data-id=${item.customId || ''}>\n            <span class=\"handle\">⋮⋮</span>\n            <div class=\"content\">\n              <div class=\"title\">${this._label(item, index)}</div>\n              <div class=\"meta\">${SubjectTypeLabel[item.answerType] || item.answerType}</div>\n            </div>\n          </div>\n        `)}\n      </div>\n    `\n  }\n}\n\nexport function register() {}\n"],"names":["QxsSubjectSortable","LitElement","changed","item","orderedIds","reorderSubjects","list","Sortable","event","oldIndex","newIndex","moveSubjectItem","index","SubjectTypeLabel","html","subjectHostStyles","css","__decorateClass","property","state","safeCustomElement"],"mappings":"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"}