@webx-ui/module-vacancies 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,467 @@
1
+ import { provide as F, inject as H, defineComponent as P, ref as x, computed as C, watch as K, openBlock as h, createElementBlock as k, createElementVNode as V, createBlock as b, unref as s, Fragment as O, renderList as U, normalizeClass as z, toDisplayString as m, createCommentVNode as $, createVNode as g, withCtx as v, createTextVNode as w, useTemplateRef as j, onMounted as G, nextTick as Y, isRef as J, withKeys as Q, defineAsyncComponent as S } from "vue";
2
+ import { reorderItems as X, useAdmin as E, useTranslate as D, useErrorText as Z, WxDate as q, WxDrafts as ee, categoryRoutes as te } from "@webx-ui/module-admin";
3
+ import { WxSkeleton as ae, WxEmpty as se, WxText as ne, WxBadge as oe, WxButton as R, toast as I, confirm as ie, useModal as re, WxDialog as ce, WxFormItem as le, WxInput as de, WxSpace as ue } from "@webx-ui/core";
4
+ const W = "vacancies";
5
+ function M(t) {
6
+ const a = `${t.apiPath}/${W}`, o = (e) => e.data, r = (e, n, c = {}) => t.http.post(`${a}/${e}/${n}`, c).then(o);
7
+ return {
8
+ list: (e = {}) => {
9
+ const n = new URLSearchParams();
10
+ return e.trashed ? n.set("trashed", "1") : n.set("state", e.state ?? "open"), e.q && n.set("q", e.q), e.category != null && n.set("category", String(e.category)), e.status && n.set("status", e.status), t.http.get(`${a}?${n}`);
11
+ },
12
+ get: (e) => t.http.get(`${a}/${e}`).then(o),
13
+ create: (e) => t.http.post(a, e).then(o),
14
+ save: (e, n) => t.http.put(`${a}/${e}`, n).then(o),
15
+ discard: (e) => t.http.post(`${a}/${e}/discard`, {}).then(o),
16
+ duplicate: (e) => t.http.post(`${a}/${e}/duplicate`, {}).then(o),
17
+ publish: (e, n) => r(e, "publish", n ? { revision: n } : {}),
18
+ unpublish: (e) => r(e, "unpublish"),
19
+ close: (e) => r(e, "close"),
20
+ reopen: (e) => r(e, "reopen"),
21
+ remove: (e) => t.http.delete(`${a}/${e}`).then(() => {
22
+ }),
23
+ restore: (e) => r(e, "restore"),
24
+ // No `category`, ever: vacancies have one order (§4.11), unlike services.
25
+ reorder: (e) => X(t, W, e, null),
26
+ versions: (e) => t.http.get(`${a}/${e}/versions`).then(o),
27
+ restoreVersion: (e, n) => t.http.post(`${a}/${e}/versions/${n}/restore`, {}).then(o)
28
+ };
29
+ }
30
+ const L = /* @__PURE__ */ Symbol("wx-vacancy-editor");
31
+ function $e(t) {
32
+ F(L, t);
33
+ }
34
+ function he() {
35
+ return H(L, null);
36
+ }
37
+ const pe = {
38
+ module: {
39
+ group: "Vacancies",
40
+ vacancies: "Vacancies",
41
+ categories: "Categories"
42
+ },
43
+ panel: {
44
+ new: "New vacancy",
45
+ "new-title": "New vacancy",
46
+ "field-title": "Position",
47
+ create: "Create",
48
+ cancel: "Cancel",
49
+ search: "Search by position or address",
50
+ empty: "No vacancies yet.",
51
+ "empty-help": "A vacancy is who you are looking for: the position, where, the terms and the pay.",
52
+ "empty-open": "No open vacancies. The closed ones are on the next tab.",
53
+ "empty-closed": "No vacancy is closed.",
54
+ "empty-search": "Nothing matches that.",
55
+ "empty-bin": "The bin is empty.",
56
+ "status-draft": "Draft",
57
+ "status-published": "Live",
58
+ "status-modified": "Live",
59
+ "status-unpublished": "Off the site",
60
+ edits: "edits",
61
+ "closed-manual": "Closed",
62
+ "closed-expired": "Expired",
63
+ "closed-manual-help": "The hiring was closed by hand.",
64
+ "closed-expired-help": "Its last day is behind us.",
65
+ "no-address": "No address in this language",
66
+ "no-city": "No city",
67
+ until: "until :date",
68
+ "until-help": "Open to the end of :date",
69
+ "view-open": "Open",
70
+ "view-closed": "Closed",
71
+ "view-all": "All",
72
+ bin: "Bin",
73
+ filters: "Filters",
74
+ "filters-reset": "Reset the filters",
75
+ "filter-status": "State",
76
+ "any-status": "Any state",
77
+ "filter-category": "Category",
78
+ "any-category": "Any category",
79
+ "order-all": "Drag a vacancy by its handle to change the order the site lists them in.",
80
+ "order-closed": "The order is set on the Open and All tabs: a closed vacancy is on no list of the site.",
81
+ "order-locked": "The order can only be changed in the whole list — clear the search and the filters.",
82
+ "reorder-failed": "The new order was not saved.",
83
+ open: "Open",
84
+ "open-on-site": "Open on the site",
85
+ "copy-address": "Copy the address",
86
+ "address-copied": "The address is copied.",
87
+ duplicate: "Duplicate",
88
+ duplicated: "This is the copy: a draft. Change what differs and publish it.",
89
+ close: "Close the hiring",
90
+ reopen: "Reopen the hiring",
91
+ "close-title": "Close “:title”?",
92
+ "close-text": "It leaves every list of the site. Its page stays, marked as closed, so links from job boards still lead somewhere.",
93
+ "reopen-title": "Reopen “:title”?",
94
+ "reopen-text": "It is back on the lists of the site, unless its last day is already behind us.",
95
+ "reopen-expired": "Its last day is behind us, so it stays closed: change “Open until” in the editor to reopen it.",
96
+ closed: "The hiring is closed.",
97
+ reopened: "The hiring is open again.",
98
+ "close-edits": "This vacancy has edits waiting. Publish or discard them first — closing would put them on the site too.",
99
+ publish: "Publish",
100
+ unpublish: "Take off the site",
101
+ delete: "Delete",
102
+ restore: "Restore",
103
+ "delete-title": "Delete “:title”?",
104
+ "delete-text": "It goes to the bin and comes off the site, and its address is free again.",
105
+ deleted: "The vacancy is in the bin.",
106
+ restored: "The vacancy is back.",
107
+ published: "The vacancy is on the site.",
108
+ "unpublished-done": "The vacancy is off the site."
109
+ },
110
+ editor: {
111
+ trail: "Where this vacancy sits",
112
+ untitled: "Untitled",
113
+ save: "Save",
114
+ "save-failed": "The vacancy was not saved.",
115
+ "publish-title": "Put “:title” on the site?",
116
+ "publish-text": "It answers at :address from the moment you do, for everyone — with its categories and form as they are chosen now.",
117
+ "publish-nowhere": "It has no address in this language yet, so nothing will answer.",
118
+ preview: "Preview",
119
+ discard: "Discard changes",
120
+ discarded: "The vacancy is back to what is published.",
121
+ "conflict-title": "The vacancy changed while you were editing",
122
+ "conflict-mine": "Keep mine",
123
+ "conflict-theirs": "Take the newer version",
124
+ "conflict-theirs-title": "Give up what you wrote?",
125
+ "conflict-theirs-text": "The vacancy is read again as it now is, and what you have typed since goes.",
126
+ leave: "Leave",
127
+ "leave-title": "Leave without saving?",
128
+ "leave-text": "The vacancy could not be saved, and what you wrote is not on the server.",
129
+ "live-since": "On the site since :date",
130
+ "open-until": "Open until :date",
131
+ "address-moving": "The address is changing. The old one keeps working and leads to the new one.",
132
+ "history-empty": "This vacancy has never been published.",
133
+ version: "#:number",
134
+ "version-live": "On the site",
135
+ "source-panel": "From the panel",
136
+ "source-mcp": "By an agent",
137
+ "source-import": "Imported",
138
+ "restore-title": "Restore version :number?",
139
+ "restore-text": "It becomes the draft. The site keeps showing what is published until you publish this.",
140
+ "restore-version": "Restore",
141
+ "restored-version": "Version :number is now the draft."
142
+ },
143
+ category: {
144
+ new: "New category",
145
+ empty: "No categories yet.",
146
+ "empty-help": "A category is a group of vacancies — development, sales — and a filter of the list on the site. It has no page of its own.",
147
+ order: "Drag to change the order of the groups on the site.",
148
+ hidden: "Hidden from the site",
149
+ "no-page": "A group, with no page of its own",
150
+ vacancies: "Vacancies: :count",
151
+ "show-vacancies": "Show its vacancies",
152
+ "delete-blocked": "This category still holds vacancies. Move them first.",
153
+ "delete-text": "It goes to the bin. Its vacancies stay.",
154
+ deleted: "The category is in the bin.",
155
+ saved: "The category is saved.",
156
+ "field-title": "Title",
157
+ "field-slug": "Key",
158
+ "field-slug-help": "In the address of the filter: ?category=… Latin letters, digits and hyphens."
159
+ },
160
+ vacancy: {
161
+ workplace: {
162
+ onsite: "On site",
163
+ remote: "Remote",
164
+ hybrid: "Hybrid"
165
+ },
166
+ employment: {
167
+ FULL_TIME: "Full-time",
168
+ PART_TIME: "Part-time",
169
+ CONTRACTOR: "Contract",
170
+ TEMPORARY: "Temporary",
171
+ INTERN: "Internship",
172
+ VOLUNTEER: "Volunteer",
173
+ PER_DIEM: "Per day",
174
+ OTHER: "Other"
175
+ }
176
+ }
177
+ };
178
+ function Ve(t) {
179
+ return `vacancy.employment.${t}`;
180
+ }
181
+ const A = /* @__PURE__ */ new WeakSet();
182
+ function B() {
183
+ try {
184
+ const { i18n: t } = E();
185
+ A.has(t) || (t.defaults("webx-vacancies", pe), A.add(t));
186
+ } catch {
187
+ }
188
+ }
189
+ const ve = { class: "wx-vacancy-history-tab" }, ye = { class: "wx-vacancy-history" }, me = { class: "wx-vacancy-history__number" }, ge = { class: "wx-vacancy-history__who" }, fe = /* @__PURE__ */ P({
190
+ name: "WxVacancyHistory",
191
+ __name: "VacancyHistory",
192
+ setup(t) {
193
+ const a = E(), o = M(a), r = he();
194
+ B();
195
+ const e = D("webx-vacancies"), n = Z(), c = x(null), p = x(!1), i = C(() => r?.vacancy.value ?? null), y = C(() => r?.canManage ?? !1), f = C(
196
+ () => i.value?.status === "published" || i.value?.status === "modified" ? c.value?.[0]?.number ?? null : null
197
+ );
198
+ async function _() {
199
+ const l = i.value;
200
+ if (l)
201
+ try {
202
+ c.value = await o.versions(l.id);
203
+ } catch (u) {
204
+ c.value = [], I.danger(n(u));
205
+ }
206
+ }
207
+ async function T(l) {
208
+ const u = i.value;
209
+ if (!(!u || !await ie({
210
+ title: e("editor.restore-title", { number: l.number }),
211
+ message: e("editor.restore-text"),
212
+ confirmText: e("editor.restore-version"),
213
+ cancelText: e("panel.cancel")
214
+ }))) {
215
+ p.value = !0;
216
+ try {
217
+ await o.restoreVersion(u.id, l.number), await r?.reload(), I.success(e("editor.restored-version", { number: l.number }));
218
+ } catch (N) {
219
+ I.danger(n(N));
220
+ } finally {
221
+ p.value = !1;
222
+ }
223
+ }
224
+ }
225
+ return K(
226
+ () => [i.value?.id, i.value?.published_at, i.value?.updated_at],
227
+ () => {
228
+ _();
229
+ },
230
+ { immediate: !0 }
231
+ ), (l, u) => (h(), k("div", ve, [
232
+ V("div", ye, [
233
+ c.value === null ? (h(), b(s(ae), {
234
+ key: 0,
235
+ class: "wx-vacancy-history__ghost",
236
+ rows: 3
237
+ })) : c.value.length === 0 ? (h(), b(s(se), {
238
+ key: 1,
239
+ description: s(e)("editor.history-empty")
240
+ }, null, 8, ["description"])) : (h(!0), k(O, { key: 2 }, U(c.value, (d) => (h(), k("div", {
241
+ key: d.number,
242
+ class: z(["wx-vacancy-history__row", { "is-live": d.number === f.value }])
243
+ }, [
244
+ V("code", me, m(s(e)("editor.version", { number: d.number })), 1),
245
+ V("div", ge, [
246
+ d.created_at ? (h(), b(s(q), {
247
+ key: 0,
248
+ value: d.created_at,
249
+ size: "md",
250
+ tone: "default"
251
+ }, null, 8, ["value"])) : $("", !0),
252
+ g(s(ne), {
253
+ size: "sm",
254
+ tone: "muted"
255
+ }, {
256
+ default: v(() => [
257
+ w(m(d.author ?? s(e)(`editor.source-${d.source}`)) + " ", 1),
258
+ d.comment ? (h(), k(O, { key: 0 }, [
259
+ w(" · " + m(d.comment), 1)
260
+ ], 64)) : $("", !0)
261
+ ]),
262
+ _: 2
263
+ }, 1024)
264
+ ]),
265
+ d.number === f.value ? (h(), b(s(oe), {
266
+ key: 0,
267
+ type: "success",
268
+ dot: ""
269
+ }, {
270
+ default: v(() => [
271
+ w(m(s(e)("editor.version-live")), 1)
272
+ ]),
273
+ _: 1
274
+ })) : $("", !0),
275
+ y.value && d.number !== f.value ? (h(), b(s(R), {
276
+ key: 1,
277
+ size: "sm",
278
+ variant: "outline",
279
+ loading: p.value,
280
+ onClick: (N) => T(d)
281
+ }, {
282
+ default: v(() => [
283
+ w(m(s(e)("editor.restore-version")), 1)
284
+ ]),
285
+ _: 1
286
+ }, 8, ["loading", "onClick"])) : $("", !0)
287
+ ], 2))), 128))
288
+ ]),
289
+ g(s(ee), {
290
+ id: i.value?.id,
291
+ entity: "vacancies",
292
+ screen: "vacancies.form",
293
+ "can-restore": y.value,
294
+ stamp: [i.value?.published_at, i.value?.updated_at],
295
+ onRestored: u[0] || (u[0] = (d) => s(r)?.reload())
296
+ }, null, 8, ["id", "can-restore", "stamp"])
297
+ ]));
298
+ }
299
+ }), be = (t, a) => {
300
+ const o = t.__vccOpts || t;
301
+ for (const [r, e] of a)
302
+ o[r] = e;
303
+ return o;
304
+ }, we = /* @__PURE__ */ be(fe, [["__scopeId", "data-v-1db40d1b"]]);
305
+ function xe(t = "/vacancies") {
306
+ return {
307
+ api: "vacancies/categories",
308
+ path: `${t}/categories`,
309
+ name: "webx.vacancies.categories",
310
+ module: "vacancy-categories",
311
+ screen: "vacancies.category-form",
312
+ manage: "vacancies.categories.manage",
313
+ count: "vacancies_count",
314
+ // Every vacancy of the category, closed ones included: "what is filed here" is the question.
315
+ items: (a) => ({ path: t, query: { category: String(a), view: "all" } }),
316
+ words: {
317
+ new: "webx-vacancies::category.new",
318
+ empty: "webx-vacancies::category.empty",
319
+ "empty-help": "webx-vacancies::category.empty-help",
320
+ order: "webx-vacancies::category.order",
321
+ hidden: "webx-vacancies::category.hidden",
322
+ "no-address": "webx-vacancies::category.no-page",
323
+ count: "webx-vacancies::category.vacancies",
324
+ "show-items": "webx-vacancies::category.show-vacancies",
325
+ "delete-blocked": "webx-vacancies::category.delete-blocked",
326
+ "delete-text": "webx-vacancies::category.delete-text",
327
+ deleted: "webx-vacancies::category.deleted",
328
+ saved: "webx-vacancies::category.saved",
329
+ "field-title": "webx-vacancies::category.field-title",
330
+ "field-slug": "webx-vacancies::category.field-slug"
331
+ }
332
+ };
333
+ }
334
+ function Ce(t = {}) {
335
+ const a = t.path ?? "/vacancies";
336
+ return [
337
+ {
338
+ id: "vacancies",
339
+ path: a,
340
+ routes: [
341
+ {
342
+ path: a,
343
+ name: "webx.vacancies",
344
+ component: () => import("./VacanciesPage-C99Ki3hv.js"),
345
+ props: { base: a }
346
+ },
347
+ {
348
+ path: `${a}/:id(\\d+)`,
349
+ name: "webx.vacancies.edit",
350
+ component: () => import("./VacancyEditorPage-Dw_pfwyv.js"),
351
+ props: { base: a }
352
+ }
353
+ ],
354
+ /*
355
+ * The one part of `vacancies.form` only this module can draw. Everything else on it is the
356
+ * panel's (`wx-slug`, `wx-categories`, `wx-relations`, `wx-rich-text`, `wx-repeater`,
357
+ * `wx-date-picker`, `wx-checkbox-group`).
358
+ */
359
+ types: {
360
+ "wx-vacancy-history": { component: we, kind: "display" }
361
+ }
362
+ },
363
+ {
364
+ id: "vacancy-categories",
365
+ path: `${a}/categories`,
366
+ routes: te(xe(a))
367
+ }
368
+ ];
369
+ }
370
+ const Ie = /* @__PURE__ */ P({
371
+ __name: "VacancyCreateDialog",
372
+ setup(t) {
373
+ const { open: a, resolve: o, dismiss: r } = re(), e = E(), n = M(e);
374
+ B();
375
+ const c = D("webx-vacancies"), p = x(""), i = x(!1), y = x({}), f = j("field");
376
+ G(async () => {
377
+ await Y(), f.value?.querySelector("input")?.focus();
378
+ });
379
+ async function _() {
380
+ if (!(p.value.trim() === "" || i.value)) {
381
+ i.value = !0, y.value = {};
382
+ try {
383
+ o((await n.create({ title: p.value.trim() })).vacancy);
384
+ } catch (T) {
385
+ y.value = T.body?.errors ?? {};
386
+ } finally {
387
+ i.value = !1;
388
+ }
389
+ }
390
+ }
391
+ return (T, l) => (h(), b(s(ce), {
392
+ open: s(a),
393
+ "onUpdate:open": l[2] || (l[2] = (u) => J(a) ? a.value = u : null),
394
+ title: s(c)("panel.new-title"),
395
+ width: 440
396
+ }, {
397
+ footer: v(() => [
398
+ g(s(ue), { size: "sm" }, {
399
+ default: v(() => [
400
+ g(s(R), {
401
+ variant: "outline",
402
+ onClick: l[1] || (l[1] = (u) => s(r)())
403
+ }, {
404
+ default: v(() => [
405
+ w(m(s(c)("panel.cancel")), 1)
406
+ ]),
407
+ _: 1
408
+ }),
409
+ g(s(R), {
410
+ type: "primary",
411
+ loading: i.value,
412
+ disabled: p.value.trim() === "",
413
+ onClick: _
414
+ }, {
415
+ default: v(() => [
416
+ w(m(s(c)("panel.create")), 1)
417
+ ]),
418
+ _: 1
419
+ }, 8, ["loading", "disabled"])
420
+ ]),
421
+ _: 1
422
+ })
423
+ ]),
424
+ default: v(() => [
425
+ g(s(le), {
426
+ label: s(c)("panel.field-title"),
427
+ error: y.value.title?.[0] ?? y.value.slug?.[0],
428
+ required: ""
429
+ }, {
430
+ default: v(() => [
431
+ V("div", {
432
+ ref_key: "field",
433
+ ref: f
434
+ }, [
435
+ g(s(de), {
436
+ modelValue: p.value,
437
+ "onUpdate:modelValue": l[0] || (l[0] = (u) => p.value = u),
438
+ "aria-label": s(c)("panel.field-title"),
439
+ onKeyup: Q(_, ["enter"])
440
+ }, null, 8, ["modelValue", "aria-label"])
441
+ ], 512)
442
+ ]),
443
+ _: 1
444
+ }, 8, ["label", "error"])
445
+ ]),
446
+ _: 1
447
+ }, 8, ["open", "title"]));
448
+ }
449
+ }), Re = S(() => import("./VacanciesPage-C99Ki3hv.js")), Ee = S(() => import("./VacancyEditorPage-Dw_pfwyv.js"));
450
+ export {
451
+ W as V,
452
+ Re as W,
453
+ Ie as _,
454
+ be as a,
455
+ Ee as b,
456
+ M as c,
457
+ we as d,
458
+ Ve as e,
459
+ he as f,
460
+ pe as g,
461
+ xe as h,
462
+ L as i,
463
+ $e as p,
464
+ B as u,
465
+ Ce as v
466
+ };
467
+ //# sourceMappingURL=index-V7QvGgXw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-V7QvGgXw.js","sources":["../src/api.ts","../src/editor.ts","../src/messages.ts","../src/i18n.ts","../src/VacancyHistory.vue","../src/module.ts","../src/VacancyCreateDialog.vue","../src/index.ts"],"sourcesContent":["import { reorderItems, type AdminContext } from '@webx-ui/module-admin'\nimport type {\n VacanciesList,\n VacancyDetail,\n VacancyInput,\n VacancyQuery,\n VacancyRow,\n VacancySave,\n VacancyVersion,\n} from './types'\n\nexport interface VacanciesApi {\n /** Every vacancy the query asks for, with what the list can be narrowed by. */\n list(query?: VacancyQuery): Promise<VacanciesList>\n /** One vacancy as its editor opens it: the record, the screen's values and the revision. */\n get(id: number): Promise<VacancyDetail>\n /** A new vacancy, made in one transaction: a refused address leaves no bare row behind. */\n create(input: VacancyInput): Promise<VacancyDetail>\n /**\n * Save the draft. Refused with a 409 when the revision is stale — the body is a\n * {@link VacancyConflict} with the vacancy as it now is.\n */\n save(id: number, input: VacancySave): Promise<VacancyDetail>\n /** Throw away what is waiting and keep what the site is showing. */\n discard(id: number): Promise<VacancyDetail>\n /**\n * A copy as a draft that was never published (decision 20): every field, the categories and\n * the form, the same title and an address with the next free suffix, right after the original.\n * The answer is the copy's form, so the editor can open it straight away.\n */\n duplicate(id: number): Promise<VacancyDetail>\n /** `revision` is what the editor held: a draft that moved on since is answered 409, not published. */\n publish(id: number, revision?: string): Promise<VacancyRow>\n unpublish(id: number): Promise<VacancyRow>\n /**\n * The hiring is over, before its last day — or it is on again. A publication of its own on the\n * server (`is_closed` is published with everything else), so it is refused with a 409 while\n * edits are waiting: closing would put them on the site too.\n */\n close(id: number): Promise<VacancyRow>\n reopen(id: number): Promise<VacancyRow>\n remove(id: number): Promise<void>\n restore(id: number): Promise<VacancyRow>\n /** The order on screen, written as a whole. There is one order and only one. */\n reorder(ids: number[]): Promise<void>\n /** The publications, newest first. */\n versions(id: number): Promise<VacancyVersion[]>\n /** An old publication becomes the draft; putting it on the site is a separate step. */\n restoreVersion(id: number, number: number): Promise<VacancyDetail>\n}\n\n/** The path of the list under the panel's API. */\nexport const VACANCIES_API = 'vacancies'\n\n/**\n * Everything under `/vacancies`, below the panel's API path (§4.11) — except the categories, which\n * are the panel's shared category API under `vacancies/categories`.\n */\nexport function createVacanciesApi(admin: AdminContext): VacanciesApi {\n const base = `${admin.apiPath}/${VACANCIES_API}`\n const data = <T>(body: { data: T }): T => body.data\n const row = (id: number, action: string, body: object = {}) =>\n admin.http.post<{ data: VacancyRow }>(`${base}/${id}/${action}`, body).then(data)\n\n return {\n list: (query = {}) => {\n const search = new URLSearchParams()\n\n // The bin holds whatever was deleted, open or closed: `state` does not apply there, and\n // saying it would read as though it did.\n if (query.trashed) search.set('trashed', '1')\n // Always said otherwise: the server's default is the open ones too, but a list that asks\n // for what it shows does not depend on somebody else's default staying put.\n else search.set('state', query.state ?? 'open')\n\n // Only what was asked for: `category=` would ask for the vacancies of no category.\n if (query.q) search.set('q', query.q)\n if (query.category != null) search.set('category', String(query.category))\n if (query.status) search.set('status', query.status)\n\n return admin.http.get<VacanciesList>(`${base}?${search}`)\n },\n get: (id) => admin.http.get<{ data: VacancyDetail }>(`${base}/${id}`).then(data),\n create: (input) => admin.http.post<{ data: VacancyDetail }>(base, input).then(data),\n save: (id, input) => admin.http.put<{ data: VacancyDetail }>(`${base}/${id}`, input).then(data),\n discard: (id) =>\n admin.http.post<{ data: VacancyDetail }>(`${base}/${id}/discard`, {}).then(data),\n duplicate: (id) =>\n admin.http.post<{ data: VacancyDetail }>(`${base}/${id}/duplicate`, {}).then(data),\n publish: (id, revision) => row(id, 'publish', revision ? { revision } : {}),\n unpublish: (id) => row(id, 'unpublish'),\n close: (id) => row(id, 'close'),\n reopen: (id) => row(id, 'reopen'),\n remove: (id) => admin.http.delete<void>(`${base}/${id}`).then(() => undefined),\n restore: (id) => row(id, 'restore'),\n // No `category`, ever: vacancies have one order (§4.11), unlike services.\n reorder: (ids) => reorderItems(admin, VACANCIES_API, ids, null),\n versions: (id) =>\n admin.http.get<{ data: VacancyVersion[] }>(`${base}/${id}/versions`).then(data),\n restoreVersion: (id, number) =>\n admin.http\n .post<{ data: VacancyDetail }>(`${base}/${id}/versions/${number}/restore`, {})\n .then(data),\n }\n}\n","import { inject, provide, type InjectionKey, type Ref } from 'vue'\nimport type { VacancyRow } from './types'\n\n/**\n * What the editor knows and the nodes of `vacancies.form` do not: the vacancy being edited, and a\n * way to read it again. The history needs both — its list is keyed by the vacancy, and a restored\n * version has to reach the fields the form is bound to.\n */\nexport interface VacancyEditorContext {\n /** The vacancy as the server last answered it, or `null` while the first request is out. */\n vacancy: Ref<VacancyRow | null>\n /** Whether this administrator may write at all. */\n canManage: boolean\n /** Ask the server for the vacancy again — after a restore, a publication, a discard. */\n reload(): Promise<void>\n}\n\nexport const vacancyEditorKey: InjectionKey<VacancyEditorContext> = Symbol('wx-vacancy-editor')\n\nexport function provideVacancyEditor(editor: VacancyEditorContext): void {\n provide(vacancyEditorKey, editor)\n}\n\n/** The editor above this node, or `null` outside one — a demo or a test draws nothing. */\nexport function useVacancyEditor(): VacancyEditorContext | null {\n return inject(vacancyEditorKey, null)\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * The English this package speaks on its own, before the server's dictionary arrives, or without\n * one. The server ships the same lines in ten languages under `webx-vacancies::` and overrides\n * these; `messages.test.ts` keeps the two sets of keys equal.\n *\n * `module`, `panel`, `editor` and `category` are the panel's own and match the server's files key\n * for key. `vacancy` is the site's group — the words of the page of a vacancy — and the panel\n * borrows the handful it prints in a row: where, the kind of employment. Only those are here.\n */\nexport const vacanciesMessages: Record<string, Messages> = {\n module: {\n group: 'Vacancies',\n vacancies: 'Vacancies',\n categories: 'Categories',\n },\n panel: {\n new: 'New vacancy',\n 'new-title': 'New vacancy',\n 'field-title': 'Position',\n create: 'Create',\n cancel: 'Cancel',\n search: 'Search by position or address',\n empty: 'No vacancies yet.',\n 'empty-help':\n 'A vacancy is who you are looking for: the position, where, the terms and the pay.',\n 'empty-open': 'No open vacancies. The closed ones are on the next tab.',\n 'empty-closed': 'No vacancy is closed.',\n 'empty-search': 'Nothing matches that.',\n 'empty-bin': 'The bin is empty.',\n\n 'status-draft': 'Draft',\n 'status-published': 'Live',\n 'status-modified': 'Live',\n 'status-unpublished': 'Off the site',\n edits: 'edits',\n 'closed-manual': 'Closed',\n 'closed-expired': 'Expired',\n 'closed-manual-help': 'The hiring was closed by hand.',\n 'closed-expired-help': 'Its last day is behind us.',\n 'no-address': 'No address in this language',\n 'no-city': 'No city',\n until: 'until :date',\n 'until-help': 'Open to the end of :date',\n\n 'view-open': 'Open',\n 'view-closed': 'Closed',\n 'view-all': 'All',\n bin: 'Bin',\n\n filters: 'Filters',\n 'filters-reset': 'Reset the filters',\n 'filter-status': 'State',\n 'any-status': 'Any state',\n 'filter-category': 'Category',\n 'any-category': 'Any category',\n\n 'order-all': 'Drag a vacancy by its handle to change the order the site lists them in.',\n 'order-closed':\n 'The order is set on the Open and All tabs: a closed vacancy is on no list of the site.',\n 'order-locked':\n 'The order can only be changed in the whole list — clear the search and the filters.',\n 'reorder-failed': 'The new order was not saved.',\n\n open: 'Open',\n 'open-on-site': 'Open on the site',\n 'copy-address': 'Copy the address',\n 'address-copied': 'The address is copied.',\n duplicate: 'Duplicate',\n duplicated: 'This is the copy: a draft. Change what differs and publish it.',\n close: 'Close the hiring',\n reopen: 'Reopen the hiring',\n 'close-title': 'Close “:title”?',\n 'close-text':\n 'It leaves every list of the site. Its page stays, marked as closed, so links from job boards still lead somewhere.',\n 'reopen-title': 'Reopen “:title”?',\n 'reopen-text': 'It is back on the lists of the site, unless its last day is already behind us.',\n 'reopen-expired':\n 'Its last day is behind us, so it stays closed: change “Open until” in the editor to reopen it.',\n closed: 'The hiring is closed.',\n reopened: 'The hiring is open again.',\n 'close-edits':\n 'This vacancy has edits waiting. Publish or discard them first — closing would put them on the site too.',\n publish: 'Publish',\n unpublish: 'Take off the site',\n delete: 'Delete',\n restore: 'Restore',\n 'delete-title': 'Delete “:title”?',\n 'delete-text': 'It goes to the bin and comes off the site, and its address is free again.',\n deleted: 'The vacancy is in the bin.',\n restored: 'The vacancy is back.',\n published: 'The vacancy is on the site.',\n 'unpublished-done': 'The vacancy is off the site.',\n },\n editor: {\n trail: 'Where this vacancy sits',\n untitled: 'Untitled',\n save: 'Save',\n 'save-failed': 'The vacancy was not saved.',\n 'publish-title': 'Put “:title” on the site?',\n 'publish-text':\n 'It answers at :address from the moment you do, for everyone — with its categories and form as they are chosen now.',\n 'publish-nowhere': 'It has no address in this language yet, so nothing will answer.',\n preview: 'Preview',\n discard: 'Discard changes',\n discarded: 'The vacancy is back to what is published.',\n 'conflict-title': 'The vacancy changed while you were editing',\n 'conflict-mine': 'Keep mine',\n 'conflict-theirs': 'Take the newer version',\n 'conflict-theirs-title': 'Give up what you wrote?',\n 'conflict-theirs-text':\n 'The vacancy is read again as it now is, and what you have typed since goes.',\n leave: 'Leave',\n 'leave-title': 'Leave without saving?',\n 'leave-text': 'The vacancy could not be saved, and what you wrote is not on the server.',\n 'live-since': 'On the site since :date',\n 'open-until': 'Open until :date',\n 'address-moving':\n 'The address is changing. The old one keeps working and leads to the new one.',\n 'history-empty': 'This vacancy has never been published.',\n version: '#:number',\n 'version-live': 'On the site',\n 'source-panel': 'From the panel',\n 'source-mcp': 'By an agent',\n 'source-import': 'Imported',\n 'restore-title': 'Restore version :number?',\n 'restore-text':\n 'It becomes the draft. The site keeps showing what is published until you publish this.',\n 'restore-version': 'Restore',\n 'restored-version': 'Version :number is now the draft.',\n },\n category: {\n new: 'New category',\n empty: 'No categories yet.',\n 'empty-help':\n 'A category is a group of vacancies — development, sales — and a filter of the list on the site. It has no page of its own.',\n order: 'Drag to change the order of the groups on the site.',\n hidden: 'Hidden from the site',\n 'no-page': 'A group, with no page of its own',\n vacancies: 'Vacancies: :count',\n 'show-vacancies': 'Show its vacancies',\n 'delete-blocked': 'This category still holds vacancies. Move them first.',\n 'delete-text': 'It goes to the bin. Its vacancies stay.',\n deleted: 'The category is in the bin.',\n saved: 'The category is saved.',\n 'field-title': 'Title',\n 'field-slug': 'Key',\n 'field-slug-help':\n 'In the address of the filter: ?category=… Latin letters, digits and hyphens.',\n },\n vacancy: {\n workplace: {\n onsite: 'On site',\n remote: 'Remote',\n hybrid: 'Hybrid',\n },\n employment: {\n FULL_TIME: 'Full-time',\n PART_TIME: 'Part-time',\n CONTRACTOR: 'Contract',\n TEMPORARY: 'Temporary',\n INTERN: 'Internship',\n VOLUNTEER: 'Volunteer',\n PER_DIEM: 'Per day',\n OTHER: 'Other',\n },\n },\n}\n\n/** The word of a schema.org employment type: `FULL_TIME` → `vacancy.employment.FULL_TIME`, as the server names it. */\nexport function employmentKey(code: string): string {\n return `vacancy.employment.${code}`\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { vacanciesMessages } from './messages'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useVacanciesMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults('webx-vacancies', vacanciesMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate, WxDrafts } from '@webx-ui/module-admin'\nimport { confirm, toast, WxBadge, WxButton, WxEmpty, WxSkeleton, WxText } from '@webx-ui/core'\nimport { createVacanciesApi } from './api'\nimport { useVacancyEditor } from './editor'\nimport { useVacanciesMessages } from './i18n'\nimport type { VacancyVersion } from './types'\n\n/**\n * What was published, when, by whom and from where — and under it, in a list of its own, the\n * copies of the draft: the autosaves, and a draft somebody else's save wrote over.\n *\n * Restoring makes the old version the draft. Publishing it is the same separate step it always\n * is, so nothing here changes the site by itself.\n */\ndefineOptions({ name: 'WxVacancyHistory' })\n\nconst context = useAdmin()\nconst api = createVacanciesApi(context)\nconst editor = useVacancyEditor()\nuseVacanciesMessages()\n\nconst t = useTranslate('webx-vacancies')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst versions = ref<VacancyVersion[] | null>(null)\nconst working = ref(false)\n\nconst vacancy = computed(() => editor?.vacancy.value ?? null)\nconst canManage = computed(() => editor?.canManage ?? false)\n\n/** The newest publication is the site — while the vacancy is on it at all. */\nconst live = computed(() =>\n vacancy.value?.status === 'published' || vacancy.value?.status === 'modified'\n ? (versions.value?.[0]?.number ?? null)\n : null,\n)\n\nasync function load(): Promise<void> {\n const current = vacancy.value\n\n if (!current) return\n\n try {\n versions.value = await api.versions(current.id)\n } catch (error) {\n versions.value = []\n toast.danger(message(error))\n }\n}\n\nasync function restore(version: VacancyVersion): Promise<void> {\n const current = vacancy.value\n\n if (!current) return\n\n const agreed = await confirm({\n title: t('editor.restore-title', { number: version.number }),\n message: t('editor.restore-text'),\n confirmText: t('editor.restore-version'),\n cancelText: t('panel.cancel'),\n })\n\n if (!agreed) return\n\n working.value = true\n\n try {\n await api.restoreVersion(current.id, version.number)\n // Through the editor rather than with the answer: the values it holds are what the form is\n // bound to, and a version restored underneath it has to reach the fields.\n await editor?.reload()\n toast.success(t('editor.restored-version', { number: version.number }))\n } catch (error) {\n toast.danger(message(error))\n } finally {\n working.value = false\n }\n}\n\n// The vacancy is read again after every publication and every restore, so its stamp is the\n// signal that there is something new to list.\nwatch(\n () => [vacancy.value?.id, vacancy.value?.published_at, vacancy.value?.updated_at],\n () => void load(),\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"wx-vacancy-history-tab\">\n <div class=\"wx-vacancy-history\">\n <wx-skeleton v-if=\"versions === null\" class=\"wx-vacancy-history__ghost\" :rows=\"3\" />\n <wx-empty v-else-if=\"versions.length === 0\" :description=\"t('editor.history-empty')\" />\n <div\n v-for=\"version in versions\"\n v-else\n :key=\"version.number\"\n class=\"wx-vacancy-history__row\"\n :class=\"{ 'is-live': version.number === live }\"\n >\n <code class=\"wx-vacancy-history__number\">{{\n t('editor.version', { number: version.number })\n }}</code>\n <div class=\"wx-vacancy-history__who\">\n <wx-date v-if=\"version.created_at\" :value=\"version.created_at\" size=\"md\" tone=\"default\" />\n <wx-text size=\"sm\" tone=\"muted\">\n {{ version.author ?? t(`editor.source-${version.source}`) }}\n <template v-if=\"version.comment\"> · {{ version.comment }}</template>\n </wx-text>\n </div>\n <wx-badge v-if=\"version.number === live\" type=\"success\" dot>{{\n t('editor.version-live')\n }}</wx-badge>\n <wx-button\n v-if=\"canManage && version.number !== live\"\n size=\"sm\"\n variant=\"outline\"\n :loading=\"working\"\n @click=\"restore(version)\"\n >\n {{ t('editor.restore-version') }}\n </wx-button>\n </div>\n </div>\n\n <wx-drafts\n :id=\"vacancy?.id\"\n entity=\"vacancies\"\n screen=\"vacancies.form\"\n :can-restore=\"canManage\"\n :stamp=\"[vacancy?.published_at, vacancy?.updated_at]\"\n @restored=\"editor?.reload()\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-vacancy-history-tab {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-24);\n}\n\n.wx-vacancy-history {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n background: var(--wx-bg-surface);\n overflow: hidden;\n}\n\n.wx-vacancy-history__ghost {\n padding: var(--wx-space-10) var(--wx-space-12);\n}\n\n.wx-vacancy-history__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n padding: var(--wx-space-10) var(--wx-space-12);\n border-block-end: 1px solid var(--wx-border-default);\n flex-wrap: wrap;\n}\n\n.wx-vacancy-history__row:last-child {\n border-block-end: 0;\n}\n\n.wx-vacancy-history__number {\n width: 40px;\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-sm);\n color: var(--wx-text-muted);\n}\n\n.wx-vacancy-history__who {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 160px;\n}\n</style>\n","import { categoryRoutes, type AdminModule, type CategoriesOptions } from '@webx-ui/module-admin'\nimport VacancyHistory from './VacancyHistory.vue'\n\nexport interface VacanciesOptions {\n /** Where the vacancies live inside the panel. The categories sit under it. */\n path?: string\n}\n\n/**\n * The categories of vacancies as the panel's shared category screens see them. Exported so that a\n * panel mounting the screens somewhere of its own does not have to repeat the words.\n *\n * A category here is a group and a filter, not a page (decision 2): its slug is the key of\n * `?category=` and of `vacancies()->in()`, and the list says \"no page of its own\" where the other\n * modules print an address.\n */\nexport function vacancyCategoriesOptions(path = '/vacancies'): CategoriesOptions {\n return {\n api: 'vacancies/categories',\n path: `${path}/categories`,\n name: 'webx.vacancies.categories',\n module: 'vacancy-categories',\n screen: 'vacancies.category-form',\n manage: 'vacancies.categories.manage',\n count: 'vacancies_count',\n // Every vacancy of the category, closed ones included: \"what is filed here\" is the question.\n items: (id) => ({ path, query: { category: String(id), view: 'all' } }),\n words: {\n new: 'webx-vacancies::category.new',\n empty: 'webx-vacancies::category.empty',\n 'empty-help': 'webx-vacancies::category.empty-help',\n order: 'webx-vacancies::category.order',\n hidden: 'webx-vacancies::category.hidden',\n 'no-address': 'webx-vacancies::category.no-page',\n count: 'webx-vacancies::category.vacancies',\n 'show-items': 'webx-vacancies::category.show-vacancies',\n 'delete-blocked': 'webx-vacancies::category.delete-blocked',\n 'delete-text': 'webx-vacancies::category.delete-text',\n deleted: 'webx-vacancies::category.deleted',\n saved: 'webx-vacancies::category.saved',\n 'field-title': 'webx-vacancies::category.field-title',\n 'field-slug': 'webx-vacancies::category.field-slug',\n },\n }\n}\n\n/**\n * The vacancies as sections of the panel: the vacancies and their categories (§4.10).\n *\n * Two modules rather than one, because the navigation is one entry per module; the server puts\n * them in the `vacancies` group, which is what draws them under one heading. A section whose\n * server half is not installed never appears — the entry is built from the manifest.\n */\nexport function vacancies(options: VacanciesOptions = {}): AdminModule[] {\n const path = options.path ?? '/vacancies'\n\n return [\n {\n id: 'vacancies',\n path,\n routes: [\n {\n path,\n name: 'webx.vacancies',\n component: () => import('./VacanciesPage.vue'),\n props: { base: path },\n },\n {\n path: `${path}/:id(\\\\d+)`,\n name: 'webx.vacancies.edit',\n component: () => import('./VacancyEditorPage.vue'),\n props: { base: path },\n },\n ],\n /*\n * The one part of `vacancies.form` only this module can draw. Everything else on it is the\n * panel's (`wx-slug`, `wx-categories`, `wx-relations`, `wx-rich-text`, `wx-repeater`,\n * `wx-date-picker`, `wx-checkbox-group`).\n */\n types: {\n 'wx-vacancy-history': { component: VacancyHistory, kind: 'display' },\n },\n },\n {\n id: 'vacancy-categories',\n path: `${path}/categories`,\n routes: categoryRoutes(vacancyCategoriesOptions(path)),\n },\n ]\n}\n","<script setup lang=\"ts\">\nimport { nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport { useAdmin, useTranslate } from '@webx-ui/module-admin'\nimport { useModal, WxButton, WxDialog, WxFormItem, WxInput, WxSpace } from '@webx-ui/core'\nimport { createVacanciesApi } from './api'\nimport { useVacanciesMessages } from './i18n'\nimport type { VacancyRow } from './types'\n\n/**\n * A new vacancy: what it is called, and nothing else. The server makes the address out of the\n * title; the address field on the settings tab is where there is room to say what changing it\n * costs.\n */\nconst { open, resolve, dismiss } = useModal<VacancyRow>()\n\nconst context = useAdmin()\nconst api = createVacanciesApi(context)\nuseVacanciesMessages()\n\nconst t = useTranslate('webx-vacancies')\n\nconst title = ref('')\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\nconst field = useTemplateRef<HTMLElement>('field')\n\nonMounted(async () => {\n await nextTick()\n field.value?.querySelector('input')?.focus()\n})\n\nasync function submit(): Promise<void> {\n if (title.value.trim() === '' || saving.value) return\n\n saving.value = true\n errors.value = {}\n\n try {\n resolve((await api.create({ title: title.value.trim() })).vacancy)\n } catch (error) {\n // The address is what can be refused here, and it is refused under the title that made it:\n // the registry sees the categories and the pages too, so \"taken\" can mean taken by either.\n errors.value = (error as { body?: { errors?: Record<string, string[]> } }).body?.errors ?? {}\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('panel.new-title')\" :width=\"440\">\n <wx-form-item\n :label=\"t('panel.field-title')\"\n :error=\"errors.title?.[0] ?? errors.slug?.[0]\"\n required\n >\n <div ref=\"field\">\n <wx-input v-model=\"title\" :aria-label=\"t('panel.field-title')\" @keyup.enter=\"submit\" />\n </div>\n </wx-form-item>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ t('panel.cancel') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"title.trim() === ''\" @click=\"submit\">\n {{ t('panel.create') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n","import { defineAsyncComponent } from 'vue'\nexport { vacancies, vacancyCategoriesOptions, type VacanciesOptions } from './module'\nexport { createVacanciesApi, VACANCIES_API, type VacanciesApi } from './api'\nexport { vacanciesMessages } from './messages'\nexport {\n provideVacancyEditor,\n vacancyEditorKey,\n useVacancyEditor,\n type VacancyEditorContext,\n} from './editor'\nexport const WxVacanciesPage = defineAsyncComponent(() => import('./VacanciesPage.vue'))\nexport { default as WxVacancyCreateDialog } from './VacancyCreateDialog.vue'\nexport const WxVacancyEditorPage = defineAsyncComponent(() => import('./VacancyEditorPage.vue'))\nexport { default as WxVacancyHistory } from './VacancyHistory.vue'\nexport type {\n VacanciesList,\n VacancyClosedReason,\n VacancyConflict,\n VacancyDetail,\n VacancyInput,\n VacancyQuery,\n VacancyRow,\n VacancySave,\n VacancyState,\n VacancyStatus,\n VacancyTermRef,\n VacancyVersion,\n VacancyWorkplace,\n} from './types'\n"],"names":["VACANCIES_API","createVacanciesApi","admin","base","data","body","row","id","action","query","search","input","revision","ids","reorderItems","number","vacancyEditorKey","provideVacancyEditor","editor","provide","useVacancyEditor","inject","vacanciesMessages","employmentKey","code","seeded","useVacanciesMessages","i18n","useAdmin","context","api","t","useTranslate","message","useErrorText","versions","ref","working","vacancy","computed","canManage","live","load","current","error","toast","restore","version","confirm","watch","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createBlock","_unref","WxSkeleton","WxEmpty","_Fragment","_renderList","_hoisted_3","_toDisplayString","_hoisted_4","WxDate","_createVNode","WxText","WxBadge","WxButton","$event","WxDrafts","_cache","vacancyCategoriesOptions","path","vacancies","options","VacancyHistory","categoryRoutes","open","resolve","dismiss","useModal","title","saving","errors","field","useTemplateRef","onMounted","nextTick","submit","WxDialog","WxSpace","WxFormItem","WxInput","WxVacanciesPage","defineAsyncComponent","WxVacancyEditorPage"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,8 +2,20 @@ export { vacancies, vacancyCategoriesOptions, type VacanciesOptions } from './mo
2
2
  export { createVacanciesApi, VACANCIES_API, type VacanciesApi } from './api';
3
3
  export { vacanciesMessages } from './messages';
4
4
  export { provideVacancyEditor, vacancyEditorKey, useVacancyEditor, type VacancyEditorContext, } from './editor';
5
- export { default as WxVacanciesPage } from './VacanciesPage';
5
+ export declare const WxVacanciesPage: import('vue').DefineComponent<{
6
+ base?: string;
7
+ }, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
8
+ base?: string;
9
+ }> & Readonly<{}>, {
10
+ base: string;
11
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
6
12
  export { default as WxVacancyCreateDialog } from './VacancyCreateDialog';
7
- export { default as WxVacancyEditorPage } from './VacancyEditorPage';
13
+ export declare const WxVacancyEditorPage: import('vue').DefineComponent<{
14
+ base?: string;
15
+ }, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
16
+ base?: string;
17
+ }> & Readonly<{}>, {
18
+ base: string;
19
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
8
20
  export { default as WxVacancyHistory } from './VacancyHistory';
9
21
  export type { VacanciesList, VacancyClosedReason, VacancyConflict, VacancyDetail, VacancyInput, VacancyQuery, VacancyRow, VacancySave, VacancyState, VacancyStatus, VacancyTermRef, VacancyVersion, VacancyWorkplace, } from './types';