@raketa-cloud/admin 0.0.15 → 0.0.16
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.
- package/package.json +1 -1
- package/src/cloud/EventChanges.js +15 -0
- package/src/cloud/EventRevisions.js +149 -0
- package/src/cloud/Events.js +135 -0
- package/src/cloud/documents/common.js +10 -0
- package/src/cloud/documents/eventsDocuments.js +254 -0
- package/src/handlers/event_revisions/CodeHandler.js +86 -0
- package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
- package/src/handlers/event_revisions/GeneralHandler.js +93 -0
- package/src/handlers/event_revisions/LocksHandler.js +51 -0
- package/src/handlers/event_revisions/MetaHandler.js +86 -0
- package/src/handlers/event_revisions/PublishesHandler.js +84 -0
- package/src/handlers/event_revisions/RevertsHandler.js +26 -0
- package/src/handlers/event_revisions/TagHandler.js +85 -0
- package/src/handlers/event_revisions/UnlocksHandler.js +22 -0
- package/src/handlers/event_revisions/VisualHandler.js +80 -0
- package/src/handlers/event_revisions/WidgetHandler.js +41 -0
- package/src/handlers/events/ClonesHandler.js +17 -0
- package/src/handlers/events/DeletesHandler.js +68 -0
- package/src/handlers/events/EventsHandler.js +121 -0
- package/src/handlers/events/TranslationsHandler.js +99 -0
- package/src/handlers/events/URLsHandler.js +71 -0
- package/src/index.js +22 -0
- package/src/routeEvents.js +55 -0
- package/src/routeStandard.js +2 -0
- package/src/setupCloud.js +12 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +139 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +65 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +150 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +131 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +143 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +158 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +135 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/events/ConesHandler.test/create.test.js +54 -0
- package/src/tests/handlers/events/DeletesHandler.test/create.test.js +110 -0
- package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +54 -0
- package/src/tests/handlers/events/EventsHandler.test/create.test.js +152 -0
- package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +41 -0
- package/src/tests/handlers/events/EventsHandler.test/index.test.js +49 -0
- package/src/tests/handlers/events/EventsHandler.test/show.test.js +105 -0
- package/src/tests/handlers/events/URLsHandler.test/create.test.js +155 -0
- package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +51 -0
- package/src/views/articles/translations/create_form.ejs +2 -2
- package/src/views/event_revisions/_nav.ejs +40 -0
- package/src/views/event_revisions/codes/edit_form.ejs +39 -0
- package/src/views/event_revisions/general/edit_form.ejs +72 -0
- package/src/views/event_revisions/locks/create_form.ejs +35 -0
- package/src/views/event_revisions/meta/edit_form.ejs +41 -0
- package/src/views/event_revisions/publishes/_form.ejs +57 -0
- package/src/views/event_revisions/publishes/create_form.ejs +10 -0
- package/src/views/event_revisions/tags/edit_form.ejs +64 -0
- package/src/views/event_revisions/visuals/edit_form.ejs +42 -0
- package/src/views/events/_form.ejs +88 -0
- package/src/views/events/create_form.ejs +9 -0
- package/src/views/events/deletes/create_form.ejs +55 -0
- package/src/views/events/edit_form.ejs +3 -0
- package/src/views/events/index.ejs +161 -0
- package/src/views/events/show.ejs +281 -0
- package/src/views/events/translations/_form.ejs +79 -0
- package/src/views/events/translations/create_form.ejs +11 -0
- package/src/views/events/urls/create_form.ejs +31 -0
- package/test/factory.js +42 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import EventsHandler from "../../../../handlers/events/EventsHandler";
|
|
2
|
+
import Events from "../../../../cloud/Events";
|
|
3
|
+
import EventChanges from "../../../../cloud/EventChanges";
|
|
4
|
+
import EventRevisions from "../../../../cloud/EventRevisions";
|
|
5
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
6
|
+
import Factory from "../../../../../test/factory";
|
|
7
|
+
|
|
8
|
+
describe("Events Handler", () => {
|
|
9
|
+
function buildCtx(event) {
|
|
10
|
+
return {
|
|
11
|
+
client: {
|
|
12
|
+
events: new Events(testConfig, "token"),
|
|
13
|
+
eventChanges: new EventChanges(testConfig, "token"),
|
|
14
|
+
eventRevisions: new EventRevisions(testConfig, "token"),
|
|
15
|
+
},
|
|
16
|
+
params: { id: event.id },
|
|
17
|
+
locale: "en",
|
|
18
|
+
locales: {
|
|
19
|
+
en: {
|
|
20
|
+
name: "English",
|
|
21
|
+
code: "en-gb",
|
|
22
|
+
flag: "/static/_assets/flags/gb.svg",
|
|
23
|
+
},
|
|
24
|
+
bg: {
|
|
25
|
+
name: "Bulgarian",
|
|
26
|
+
code: "bg",
|
|
27
|
+
flag: "/static/_assets/flags/bg.svg",
|
|
28
|
+
},
|
|
29
|
+
de: {
|
|
30
|
+
name: "German",
|
|
31
|
+
code: "de",
|
|
32
|
+
flag: "/static/_assets/flags/de.svg",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
test("show for existing event", async () => {
|
|
39
|
+
const event = Factory.build("event", {
|
|
40
|
+
translations: {
|
|
41
|
+
de: {
|
|
42
|
+
id: 42,
|
|
43
|
+
},
|
|
44
|
+
bg: {
|
|
45
|
+
id: 69,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const revision = Factory.build("event_revision", {
|
|
50
|
+
originalId: event.id,
|
|
51
|
+
});
|
|
52
|
+
const change = Factory.build("event_change");
|
|
53
|
+
const ctx = buildCtx(event);
|
|
54
|
+
|
|
55
|
+
const mockedeventFind = jest
|
|
56
|
+
.spyOn(ctx.client.events, "find")
|
|
57
|
+
.mockImplementation(() => event);
|
|
58
|
+
|
|
59
|
+
const mockedEventRevisions = jest
|
|
60
|
+
.spyOn(ctx.client.eventRevisions, "all")
|
|
61
|
+
.mockImplementation(() => ({ list: [revision] }));
|
|
62
|
+
|
|
63
|
+
const mockedEventChanges = jest
|
|
64
|
+
.spyOn(ctx.client.eventChanges, "all")
|
|
65
|
+
.mockImplementation(() => ({ list: [change] }));
|
|
66
|
+
|
|
67
|
+
const result = await EventsHandler.show(ctx);
|
|
68
|
+
|
|
69
|
+
expect(mockedeventFind).toHaveBeenCalledWith(event.id, "en");
|
|
70
|
+
expect(mockedEventRevisions).toHaveBeenCalledWith(event.id, "en");
|
|
71
|
+
expect(mockedEventChanges).toHaveBeenCalledWith(event.id, "en");
|
|
72
|
+
|
|
73
|
+
expect(result).toEqual({
|
|
74
|
+
assigns: {
|
|
75
|
+
event,
|
|
76
|
+
revisions: [revision],
|
|
77
|
+
changes: [change],
|
|
78
|
+
_translations: [
|
|
79
|
+
{
|
|
80
|
+
locale: "bg",
|
|
81
|
+
path: "/bg/events/69",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
locale: "de",
|
|
85
|
+
path: "/de/events/42",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("show for non existing event", async () => {
|
|
93
|
+
const ctx = buildCtx({ id: "42" });
|
|
94
|
+
|
|
95
|
+
const mockedeventFind = jest
|
|
96
|
+
.spyOn(ctx.client.events, "find")
|
|
97
|
+
.mockImplementation(() => null);
|
|
98
|
+
|
|
99
|
+
expect(async () => {
|
|
100
|
+
await EventsHandler.show(ctx);
|
|
101
|
+
}).rejects.toThrow("Missing event #42");
|
|
102
|
+
|
|
103
|
+
expect(mockedeventFind).toHaveBeenCalledWith("42", "en");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import URLsHandler from "../../../../handlers/events/URLsHandler";
|
|
2
|
+
import Events from "../../../../cloud/Events";
|
|
3
|
+
import Factory from "../../../../../test/factory";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
|
|
6
|
+
function buildCtx(event, updateSettings) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
events: new Events(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: event.id },
|
|
12
|
+
resourceParams: {
|
|
13
|
+
change: updateSettings,
|
|
14
|
+
},
|
|
15
|
+
locale: "en",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("Event change url", () => {
|
|
20
|
+
test("create successful", async () => {
|
|
21
|
+
const event = Factory.build("event");
|
|
22
|
+
const updateSettings = {
|
|
23
|
+
slug: "new-slug",
|
|
24
|
+
redirect: "1",
|
|
25
|
+
};
|
|
26
|
+
const ctx = buildCtx(event, updateSettings);
|
|
27
|
+
|
|
28
|
+
const mockFind = jest
|
|
29
|
+
.spyOn(ctx.client.events, "find")
|
|
30
|
+
.mockImplementation(() => event);
|
|
31
|
+
|
|
32
|
+
const mockChange = jest
|
|
33
|
+
.spyOn(ctx.client.events, "updateSlug")
|
|
34
|
+
.mockImplementation(() => ({ event, errors: null }));
|
|
35
|
+
|
|
36
|
+
const result = await URLsHandler.create(ctx);
|
|
37
|
+
|
|
38
|
+
expect(mockFind).toHaveBeenCalledWith(event.id, "en");
|
|
39
|
+
expect(mockChange).toHaveBeenCalledWith(
|
|
40
|
+
event.id,
|
|
41
|
+
updateSettings.slug,
|
|
42
|
+
"en",
|
|
43
|
+
{
|
|
44
|
+
url: `/${event.slug}`,
|
|
45
|
+
destination: updateSettings.slug,
|
|
46
|
+
httpResponseCode: 301,
|
|
47
|
+
note: "Created with changed URL for a event",
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
expect(result).toEqual({
|
|
52
|
+
redirect: `/en/events/${event.id}`,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("create failed due to slug error", async () => {
|
|
57
|
+
const event = Factory.build("event");
|
|
58
|
+
const updateSettings = {
|
|
59
|
+
slug: "new-slug",
|
|
60
|
+
};
|
|
61
|
+
const ctx = buildCtx(event, updateSettings);
|
|
62
|
+
|
|
63
|
+
const mockFind = jest
|
|
64
|
+
.spyOn(ctx.client.events, "find")
|
|
65
|
+
.mockImplementation(() => event);
|
|
66
|
+
|
|
67
|
+
const mockChange = jest
|
|
68
|
+
.spyOn(ctx.client.events, "updateSlug")
|
|
69
|
+
.mockImplementation(() => ({
|
|
70
|
+
event: null,
|
|
71
|
+
errors: [{ codes: [], key: "slug", message: "has already been taken" }],
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
const result = await URLsHandler.create(ctx);
|
|
75
|
+
|
|
76
|
+
expect(mockFind).toHaveBeenCalledWith(event.id, "en");
|
|
77
|
+
expect(mockChange).toHaveBeenCalledWith(
|
|
78
|
+
event.id,
|
|
79
|
+
updateSettings.slug,
|
|
80
|
+
"en",
|
|
81
|
+
null
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(result).toEqual({
|
|
85
|
+
assigns: {
|
|
86
|
+
change: { ...updateSettings, id: event.id },
|
|
87
|
+
errors: { change: { slug: "has already been taken" } },
|
|
88
|
+
_translations: [],
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("create failed due to redirect create", async () => {
|
|
94
|
+
const event = Factory.build("event");
|
|
95
|
+
const updateSettings = {
|
|
96
|
+
slug: "new-slug",
|
|
97
|
+
redirect: "1",
|
|
98
|
+
};
|
|
99
|
+
const ctx = buildCtx(event, updateSettings);
|
|
100
|
+
|
|
101
|
+
const mockFind = jest
|
|
102
|
+
.spyOn(ctx.client.events, "find")
|
|
103
|
+
.mockImplementation(() => event);
|
|
104
|
+
|
|
105
|
+
const mockChange = jest
|
|
106
|
+
.spyOn(ctx.client.events, "updateSlug")
|
|
107
|
+
.mockImplementation(() => ({
|
|
108
|
+
event: null,
|
|
109
|
+
errors: [
|
|
110
|
+
{
|
|
111
|
+
codes: [],
|
|
112
|
+
key: "generalError",
|
|
113
|
+
message: "url: has already been taken",
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
}));
|
|
117
|
+
|
|
118
|
+
const result = await URLsHandler.create(ctx);
|
|
119
|
+
|
|
120
|
+
expect(mockFind).toHaveBeenCalledWith(event.id, "en");
|
|
121
|
+
expect(mockChange).toHaveBeenCalledWith(
|
|
122
|
+
event.id,
|
|
123
|
+
updateSettings.slug,
|
|
124
|
+
"en",
|
|
125
|
+
{
|
|
126
|
+
url: `/${event.slug}`,
|
|
127
|
+
destination: updateSettings.slug,
|
|
128
|
+
httpResponseCode: 301,
|
|
129
|
+
note: "Created with changed URL for a event",
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
expect(result).toEqual({
|
|
134
|
+
assigns: {
|
|
135
|
+
change: { ...updateSettings, id: event.id },
|
|
136
|
+
errors: { change: { redirect: "url: has already been taken" } },
|
|
137
|
+
_translations: [],
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("create for non existing event", async () => {
|
|
143
|
+
const ctx = buildCtx({ id: "42" }, {});
|
|
144
|
+
|
|
145
|
+
const mockFind = jest
|
|
146
|
+
.spyOn(ctx.client.events, "find")
|
|
147
|
+
.mockImplementation(() => null);
|
|
148
|
+
|
|
149
|
+
expect(async () => {
|
|
150
|
+
await URLsHandler.create(ctx);
|
|
151
|
+
}).rejects.toThrow("Cannot find event with id 42");
|
|
152
|
+
|
|
153
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
154
|
+
});
|
|
155
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import URLsHandler from "../../../../handlers/events/URLsHandler";
|
|
2
|
+
import Events from "../../../../cloud/Events";
|
|
3
|
+
import Factory from "../../../../../test/factory";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
|
|
6
|
+
function buildCtx(event) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
events: new Events(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: event.id },
|
|
12
|
+
locale: "en",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe("Event change url", () => {
|
|
17
|
+
test("create_form for existing event", async () => {
|
|
18
|
+
const event = Factory.build("event");
|
|
19
|
+
const ctx = buildCtx(event);
|
|
20
|
+
|
|
21
|
+
const mockFind = jest
|
|
22
|
+
.spyOn(ctx.client.events, "find")
|
|
23
|
+
.mockImplementation(() => event);
|
|
24
|
+
|
|
25
|
+
const result = await URLsHandler.create_form(ctx);
|
|
26
|
+
|
|
27
|
+
expect(mockFind).toHaveBeenCalledWith(event.id, "en");
|
|
28
|
+
|
|
29
|
+
expect(result).toEqual({
|
|
30
|
+
assigns: {
|
|
31
|
+
change: { slug: event.slug, id: event.id, redirect: null },
|
|
32
|
+
errors: {},
|
|
33
|
+
_translations: [],
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("create_form for non existing event", async () => {
|
|
39
|
+
const ctx = buildCtx({ id: "42" });
|
|
40
|
+
|
|
41
|
+
const mockFind = jest
|
|
42
|
+
.spyOn(ctx.client.events, "find")
|
|
43
|
+
.mockImplementation(() => null);
|
|
44
|
+
|
|
45
|
+
expect(async () => {
|
|
46
|
+
await URLsHandler.create_form(ctx);
|
|
47
|
+
}).rejects.toThrow("Cannot find event with id 42");
|
|
48
|
+
|
|
49
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<div class="w-full">
|
|
2
2
|
<div class="flex items-center justify-between mt-6 mb-4">
|
|
3
3
|
<div class="flex items-center gap-2">
|
|
4
|
-
<h1 class="heading-1">Create
|
|
4
|
+
<h1 class="heading-1">Create article translation</h1>
|
|
5
5
|
</div>
|
|
6
6
|
</div>
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
9
|
<div class="grid gap-4 md:grid-cols-3">
|
|
10
10
|
<%- include('_form.ejs') %>
|
|
11
|
-
</div>
|
|
11
|
+
</div>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const activeClass = "relative top-0.5 px-4 border-b-2 border-raketa-primary pb-4";
|
|
3
|
+
const inactiveClass = "relative top-0.5 px-4 border-b-2 border-transparent pb-4";
|
|
4
|
+
%>
|
|
5
|
+
|
|
6
|
+
<div class="flex w-full pb-4">
|
|
7
|
+
<div class="flex items-center justify-between mb-4">
|
|
8
|
+
<div class="flex items-center border-b-2">
|
|
9
|
+
<div class=" <%= active === 'general' ? activeClass : inactiveClass %>">
|
|
10
|
+
<a href="<%= `/${_context.locale}/event_revisions/${settings.id}/general/edit` %>" class="text-raketa-primary font-semibold">
|
|
11
|
+
General
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="<%= active === 'visuals' ? activeClass : inactiveClass %>">
|
|
16
|
+
<a href="<%= `/${_context.locale}/event_revisions/${settings.id}/visuals/edit` %>" class="text-raketa-primary font-semibold">
|
|
17
|
+
Visuals
|
|
18
|
+
</a>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div class="<%= active === 'codes' ? activeClass : inactiveClass %>">
|
|
22
|
+
<a href="<%= `/${_context.locale}/event_revisions/${settings.id}/codes/edit` %>" class="text-raketa-primary font-semibold">
|
|
23
|
+
Code customizations
|
|
24
|
+
</a>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div class="<%= active === 'meta' ? activeClass : inactiveClass %>">
|
|
28
|
+
<a href="<%= `/${_context.locale}/event_revisions/${settings.id}/meta/edit` %>" class="text-raketa-primary font-semibold">
|
|
29
|
+
Open graph & meta tags
|
|
30
|
+
</a>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div class="<%= active === 'tags' ? activeClass : inactiveClass %>">
|
|
34
|
+
<a href="<%= `/${_context.locale}/event_revisions/${settings.id}/tags/edit` %>" class="text-raketa-primary font-semibold">
|
|
35
|
+
Content tags
|
|
36
|
+
</a>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<div class="page-wrapper">
|
|
2
|
+
<div class="page-title">
|
|
3
|
+
<h1 class="heading-1">Edit revision / Code customizations</h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<%- include('../_nav.ejs', { settings: code_settings, active: 'codes' }) %>
|
|
7
|
+
|
|
8
|
+
<div class="grid gap-4 md:grid-cols-3">
|
|
9
|
+
<div>
|
|
10
|
+
<% form_for({ code_settings }, errors, (f) => { %>
|
|
11
|
+
<form action="<%= `/${_context.locale}/event_revisions/${code_settings.id}/codes` %>" method="POST" class="form">
|
|
12
|
+
<%- f.field('code_settings.scripts', { as: 'textarea', }) %>
|
|
13
|
+
<%- f.field('code_settings.structured_data', { label: 'Structured data (JSON)', as: 'textarea', hint: 'Click here for a structured data verification tool' }) %>
|
|
14
|
+
|
|
15
|
+
<div class="form-actions">
|
|
16
|
+
<div class="btn-toolbar">
|
|
17
|
+
<%- f.submit('Save changes', { class: 'btn-primary' }) %>
|
|
18
|
+
<a href="<%= `/${_context.locale}/events/${code_settings.originalId}` %>" class="btn-secondary">Back</a>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</form>
|
|
22
|
+
<% }) %>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div>
|
|
26
|
+
<div class="help">
|
|
27
|
+
<div class="mb-2 flex items-center gap-1">
|
|
28
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
|
29
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
|
|
30
|
+
</svg>
|
|
31
|
+
|
|
32
|
+
<h3 class="heading-3">Contextual help</h3>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<div class="page-wrapper">
|
|
2
|
+
<div class="page-title">
|
|
3
|
+
<h1 class="heading-1">Edit revision / General</h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<%- include('../_nav.ejs', { settings: general_settings, active: 'general' }) %>
|
|
7
|
+
|
|
8
|
+
<div class="grid gap-4 md:grid-cols-3">
|
|
9
|
+
<div>
|
|
10
|
+
<% form_for({ general_settings }, errors, (f) => { %>
|
|
11
|
+
<form action="<%= `/${_context.locale}/event_revisions/${general_settings.id}/general` %>" method="POST" class="form">
|
|
12
|
+
<%- f.field('general_settings.title', { required: true }) %>
|
|
13
|
+
<%- f.field('general_settings.slug', { label: "URL", required: true }) %>
|
|
14
|
+
<%- f.field('general_settings.publish_at', { required: true, type: 'datetime-local' }) %>
|
|
15
|
+
<%- f.field('general_settings.starts_at', { required: true, type: 'datetime-local' }) %>
|
|
16
|
+
<%- f.field('general_settings.ends_at', { required: true, type: 'datetime-local' }) %>
|
|
17
|
+
<%- f.field('general_settings.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
|
|
18
|
+
|
|
19
|
+
<%- f.field('general_settings.username', { required: true }) %>
|
|
20
|
+
<%- f.field('general_settings.password', { required: true }) %>
|
|
21
|
+
|
|
22
|
+
<div class="form-actions">
|
|
23
|
+
<div class="btn-toolbar">
|
|
24
|
+
<%- f.submit('Save changes', { class: 'btn-primary' }) %>
|
|
25
|
+
<a href="<%= `/${_context.locale}/events/${general_settings.originalId}` %>" class="btn-secondary">Back</a>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</form>
|
|
29
|
+
<% }) %>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div>
|
|
33
|
+
<div class="help">
|
|
34
|
+
<div class="mb-2 flex items-center gap-1">
|
|
35
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
|
36
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
|
|
37
|
+
</svg>
|
|
38
|
+
|
|
39
|
+
<h3 class="heading-3">Contextual help</h3>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<script>
|
|
49
|
+
function onVisibilityChange(event) {
|
|
50
|
+
const newValue = event.target.value;
|
|
51
|
+
|
|
52
|
+
if (newValue === "protected") {
|
|
53
|
+
document.getElementById("f_username").parentElement.style.display = "block";
|
|
54
|
+
document.getElementById("f_username").required = true;
|
|
55
|
+
document.getElementById("f_password").parentElement.style.display = "block";
|
|
56
|
+
document.getElementById("f_password").required = true;
|
|
57
|
+
} else {
|
|
58
|
+
document.getElementById("f_username").parentElement.style.display = "none";
|
|
59
|
+
document.getElementById("f_username").required = false;
|
|
60
|
+
document.getElementById("f_password").parentElement.style.display = "none";
|
|
61
|
+
document.getElementById("f_password").required = false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
onVisibilityChange({
|
|
66
|
+
target: {
|
|
67
|
+
value: '<%= general_settings.visibility %>'
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
|
|
72
|
+
</script>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<div class="page-wrapper">
|
|
2
|
+
<div class="page-title">
|
|
3
|
+
<h1 class="heading-1">Lock revision</h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="grid gap-4 md:grid-cols-3">
|
|
7
|
+
<div>
|
|
8
|
+
<% form_for({ lock_settings }, errors, (f) => { %>
|
|
9
|
+
<form action="<%= `/${_context.locale}/event_revisions/${lock_settings.revision.id}/locks` %>" method="POST" class="form">
|
|
10
|
+
<%- f.field('lock_settings.message', { as: 'textarea', label: 'Lock Message', required: true }) %>
|
|
11
|
+
<div class="form-actions">
|
|
12
|
+
<div class="btn-toolbar">
|
|
13
|
+
<%- f.submit('Lock revision', { class: 'btn-primary' }) %>
|
|
14
|
+
<a href="<%= `/${_context.locale}/events/${lock_settings.revision.originalId}` %>" class="btn-secondary">Cancel</a>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</form>
|
|
18
|
+
<% }) %>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div>
|
|
22
|
+
<div class="help">
|
|
23
|
+
<div class="mb-2 flex items-center gap-1">
|
|
24
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
|
25
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
|
|
26
|
+
</svg>
|
|
27
|
+
|
|
28
|
+
<h3 class="heading-3">Contextual help</h3>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<p>Locking a revision will prevent further changes to this version of the event. This action cannot be undone. Please provide a reason for locking this revision.</p>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<div class="page-wrapper">
|
|
2
|
+
<div class="page-title">
|
|
3
|
+
<h1 class="heading-1">Edit revision / Open graph & meta tags</h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<%- include('../_nav.ejs', { settings: meta_settings, active: 'meta' }) %>
|
|
7
|
+
|
|
8
|
+
<div class="grid gap-4 md:grid-cols-3">
|
|
9
|
+
<div>
|
|
10
|
+
<% form_for({ meta_settings }, errors, (f) => { %>
|
|
11
|
+
<form action="<%= `/${_context.locale}/event_revisions/${meta_settings.id}/meta` %>" method="POST" class="form">
|
|
12
|
+
<%- f.field('meta_settings.title', { required: true }) %>
|
|
13
|
+
<%- f.field('meta_settings.description', { as: 'textarea', required: true }) %>
|
|
14
|
+
|
|
15
|
+
<raketa-image-picker name="meta_settings[image]" value="<%= JSON.stringify(meta_settings.image) %>"></raketa-image-picker>
|
|
16
|
+
|
|
17
|
+
<div class="form-actions">
|
|
18
|
+
<div class="btn-toolbar">
|
|
19
|
+
<%- f.submit('Save changes', { class: 'btn-primary' }) %>
|
|
20
|
+
<a href="<%= `/${_context.locale}/events/${meta_settings.originalId}` %>" class="btn-secondary">Back</a>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</form>
|
|
24
|
+
<% }) %>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div>
|
|
28
|
+
<div class="help">
|
|
29
|
+
<div class="mb-2 flex items-center gap-1">
|
|
30
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
|
31
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
|
|
32
|
+
</svg>
|
|
33
|
+
|
|
34
|
+
<h3 class="heading-3">Contextual help</h3>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<% form_for({ publishing }, errors, (f) => { %>
|
|
2
|
+
<form action="<%= `/${_context.locale}/event_revisions/${publishing.id}/publishes` %>" method="post" class="form">
|
|
3
|
+
<%- f.field('publishing.title'), { required: true } %>
|
|
4
|
+
<%- f.field('publishing.description', { as: "textarea" }) %>
|
|
5
|
+
<%- f.field('publishing.visibility', { as: 'select', required: true, options: visibilityOptions }) %>
|
|
6
|
+
<%- f.field('publishing.username', { required: true }) %>
|
|
7
|
+
<%- f.field('publishing.password', { required: true }) %>
|
|
8
|
+
|
|
9
|
+
<div class="form-actions">
|
|
10
|
+
<div class="btn-toolbar">
|
|
11
|
+
<%- f.submit('Save record', { class: 'btn-primary' }) %>
|
|
12
|
+
|
|
13
|
+
<a href="<%= `/${_context.locale}/events/${publishing.originalId}` %>" class="btn-secondary">Back</a>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
</form>
|
|
17
|
+
<% }) %>
|
|
18
|
+
|
|
19
|
+
<div>
|
|
20
|
+
<div class="help">
|
|
21
|
+
<div class="flex items-center gap-1 mb-2">
|
|
22
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
|
23
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
|
|
24
|
+
</svg>
|
|
25
|
+
|
|
26
|
+
<h3 class="heading-3">Contextual help</h3>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempore nostrum fugit sint sunt distinctio ut cum, corrupti ad error, quo labore minima. Reprehenderit quasi maxime repudiandae voluptatum commodi saepe molestiae?</p>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<script>
|
|
34
|
+
function onVisibilityChange(event) {
|
|
35
|
+
const newValue = event.target.value;
|
|
36
|
+
|
|
37
|
+
if (newValue === "protected") {
|
|
38
|
+
document.getElementById("f_username").parentElement.style.display = "block";
|
|
39
|
+
document.getElementById("f_username").required = true;
|
|
40
|
+
document.getElementById("f_password").parentElement.style.display = "block";
|
|
41
|
+
document.getElementById("f_password").required = true;
|
|
42
|
+
} else {
|
|
43
|
+
document.getElementById("f_username").parentElement.style.display = "none";
|
|
44
|
+
document.getElementById("f_username").required = false;
|
|
45
|
+
document.getElementById("f_password").parentElement.style.display = "none";
|
|
46
|
+
document.getElementById("f_password").required = false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
onVisibilityChange({
|
|
51
|
+
target: {
|
|
52
|
+
value: '<%= publishing.visibility %>'
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
document.getElementById("f_visibility").addEventListener("change", onVisibilityChange)
|
|
57
|
+
</script>
|