Skip to content

Commit 719c0b9

Browse files
[9.x] Revision changes (#744)
1 parent 14481af commit 719c0b9

File tree

9 files changed

+104
-115
lines changed

9 files changed

+104
-115
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"pixelfear/composer-dist-plugin": "^0.1.5",
4747
"spatie/ignition": "^1.15",
4848
"spatie/invade": "^2.1",
49-
"statamic/cms": "^6.0.0-alpha.15",
49+
"statamic/cms": "^6.0.0-alpha.16",
5050
"stillat/proteus": "^4.0"
5151
},
5252
"require-dev": {

resources/js/components/PublishActions.vue

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,60 @@
66
-->
77

88
<stack narrow name="publish-options" @closed="$emit('closed')" v-slot="{ close }">
9-
<div class="dark:bg-dark-800 flex h-full flex-col bg-white">
10-
<div
11-
class="dark:border-dark-900 dark:bg-dark-600 flex items-center justify-between border-b border-gray-300 bg-gray-200 px-6 py-2 text-lg font-medium"
9+
<div class="m-2 flex h-full flex-col rounded-xl bg-white dark:bg-gray-800">
10+
<header
11+
class="flex items-center justify-between rounded-t-xl border-b border-gray-300 px-4 mb-3 py-2 dark:border-gray-950 dark:bg-gray-800"
1212
>
13-
{{ __('Publish') }}
14-
<button type="button" class="btn-close" @click="close" v-html="'&times'" />
15-
</div>
13+
<Heading size="lg">{{ __('Publish') }}</Heading>
14+
<Button icon="x" variant="ghost" class="-me-2" @click="close" />
15+
</header>
1616

17-
<div class="flex-1 overflow-auto p-6">
17+
<div class="flex-1 overflow-auto">
1818
<div class="loading flex h-full items-center justify-center" v-if="saving">
19-
<loading-graphic text="" />
19+
<Icon name="loading" />
2020
</div>
2121

22-
<template v-else>
23-
<select-input class="mb-6" v-model="action" :options="options" />
22+
<div class="p-3 flex flex-col space-y-6" v-else>
23+
<Select class="w-full" :options v-model="action" />
2424

25-
<div v-if="action">
26-
<date-fieldtype
27-
v-if="action == 'schedule'"
28-
class="mb-6"
29-
name="publishTime"
30-
:value="publishTime"
31-
/>
25+
<template v-if="action">
26+
<!-- <DatePicker-->
27+
<!-- v-if="action == 'schedule'"-->
28+
<!-- v-model="publishTime"-->
29+
<!-- />-->
3230

33-
<textarea-input
34-
class="mb-6 text-sm"
31+
<Textarea
32+
class="text-sm"
3533
v-model="revisionMessage"
3634
:placeholder="__('Notes about this revision')"
3735
@keydown.enter="submit"
3836
:focus="true"
3937
/>
4038

41-
<button class="btn-primary mb-6 w-full" v-text="submitButtonText" @click="submit" />
39+
<Button variant="primary" :text="submitButtonText" @click="submit" />
4240

43-
<div class="text-gray mb-6 flex text-xs">
44-
<div class="w-4 pt-px ltr:mr-2 rtl:ml-2">
45-
<svg-icon name="info-circle" class="pt-px" />
46-
</div>
47-
<div class="flex-1" v-text="actionInfoText" />
41+
<div class="flex">
42+
<Icon name="info" class="size-4 shrink-0 me-2" />
43+
<Subheading size="sm" class="flex-1" :text="actionInfoText" />
4844
</div>
4945

50-
<div class="text-gray mb-6 flex text-xs text-red-500" v-if="action === 'schedule'">
51-
<div class="w-4 pt-px ltr:mr-2 rtl:ml-2">
52-
<svg-icon name="info-circle" class="pt-px" />
53-
</div>
54-
<div
55-
class="flex-1"
56-
v-text="__('messages.publish_actions_current_becomes_draft_because_scheduled')"
57-
/>
46+
<div class="flex text-red-600" v-if="action === 'schedule'">
47+
<Icon name="info" class="size-4 shrink-0 me-2" />
48+
<Subheading size="sm" class="flex-1 text-red-600" :text="__('messages.publish_actions_current_becomes_draft_because_scheduled')" />
5849
</div>
59-
</div>
60-
</template>
50+
</template>
51+
</div>
6152
</div>
6253
</div>
6354
</stack>
6455
</template>
6556

6657
<script>
58+
import { Heading, Button, Select, DatePicker, Textarea, Icon, Subheading } from '@statamic/cms/ui';
59+
6760
export default {
61+
components: { Heading, Button, Select, DatePicker, Textarea, Icon, Subheading },
62+
6863
props: {
6964
actions: Object,
7065
published: Boolean,
@@ -94,6 +89,8 @@ export default {
9489
}
9590
}
9691
92+
// options.push({ value: 'schedule', label: __('Schedule') });
93+
9794
options.push({ value: 'revision', label: __('Create Revision') });
9895
9996
return options;
@@ -134,7 +131,6 @@ export default {
134131
.run('runway.publishing', {
135132
resource: this.resourceHandle,
136133
message: this.revisionMessage,
137-
storeName: this.publishContainer,
138134
})
139135
.then(this.performPublishRequest)
140136
.catch((error) => {

resources/js/components/PublishForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ export default {
506506
if (this.revisionsEnabled) {
507507
clearTimeout(this.trackDirtyStateTimeout);
508508
this.trackDirtyState = false;
509-
this.values = resetValuesFromResponse(response.data.data.values);
509+
this.values = resetValuesFromResponse(response.data.data.values, this.$refs.container);
510510
this.trackDirtyStateTimeout = setTimeout(() => (this.trackDirtyState = true), 500);
511511
this.$nextTick(() => this.$emit('saved', response));
512512
return;

resources/js/components/revision-history/Revision.vue

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,95 +5,96 @@
55
-->
66

77
<div
8-
class="block cursor-pointer space-y-2 px-3 py-2 text-sm hover:bg-gray-50 dark:hover:bg-gray-900"
8+
class="relative block cursor-pointer space-y-2 px-3 py-2 text-sm hover:[&_.revision-message]:underline"
99
:class="{
10-
'status-working-copy': revision.working,
10+
'status-working-copy': revision.action === 'working',
1111
'status-published': revision.attributes.published,
12+
'border border-ui-accent-bg dark:border-dark-ui-accent-bg/90 rounded-lg py-2.5 bg-[hsl(from_var(--theme-color-ui-accent-bg)_h_s_97)] dark:bg-[hsl(from_var(--theme-color-dark-ui-accent-bg)_h_40_20)]': revision.attributes.current,
13+
'bg-gradient-to-b from-transparent from-60% to-white dark:to-gray-800 -mt-1': isLast,
1214
}"
15+
v-tooltip="revision.attributes.current ? __('Current Revision') : null"
1316
@click="open"
1417
>
15-
<div v-if="revision.message" class="revision-item-note truncate" v-text="revision.message" />
18+
<div class="flex gap-3">
19+
<Avatar v-if="revision.user" :user="revision.user" class="size-6 shrink-0 mt-1" />
1620

17-
<div class="flex items-center gap-2">
18-
<avatar v-if="revision.user" :user="revision.user" class="size-6 shrink-0" />
21+
<div class="grid gap-1">
22+
<div v-if="revision.message" class="revision-message font-medium" v-text="revision.message" />
23+
<Subheading class="text-xs text-gray-500! dark:text-gray-400!" :class="{ 'text-gray-800! dark:text-white!': revision.attributes.current }">
24+
{{ time }}
25+
<template v-if="revision.user">
26+
by {{ revision.user.name || revision.user.email }}
27+
</template>
28+
</Subheading>
29+
</div>
1930

20-
<div class="revision-item-content flex w-full">
21-
<div class="flex-1">
22-
<Subheading>
23-
<template v-if="revision.user">
24-
{{ revision.user.name || revision.user.email }} &ndash;
25-
</template>
26-
{{ time }}
27-
</Subheading>
28-
</div>
31+
<div class="flex items-center gap-1 ml-auto">
32+
<Badge
33+
size="sm"
34+
:color="
35+
revision.action === 'working'
36+
? 'gray'
37+
: {
38+
publish: 'green',
39+
revision: 'gray',
40+
restore: 'gray',
41+
unpublish: 'red',
42+
}[revision.action]
43+
"
44+
:text="
45+
revision.action === 'working'
46+
? __('Working Copy')
47+
: {
48+
publish: __('Published'),
49+
revision: __('Revision'),
50+
restore: __('Restored'),
51+
unpublish: __('Unpublished'),
52+
}[revision.action]
53+
"
54+
/>
55+
</div>
2956

30-
<div class="flex items-center gap-1">
31-
<Badge
32-
size="sm"
33-
:color="
34-
revision.working
35-
? 'gray'
36-
: {
37-
publish: 'green',
38-
revision: 'gray',
39-
restore: 'gray',
40-
unpublish: 'red',
41-
}[revision.action]
42-
"
43-
:text="
44-
revision.working
45-
? __('Working Copy')
46-
: {
47-
publish: __('Published'),
48-
revision: __('Revision'),
49-
restore: __('Restored'),
50-
unpublish: __('Unpublished'),
51-
}[revision.action]
52-
"
57+
<revision-preview
58+
v-if="showDetails"
59+
:revision="revision"
60+
component="runway-publish-form"
61+
:component-props="componentProps"
62+
@closed="showDetails = false"
63+
>
64+
<template #action-buttons-right>
65+
<restore-revision
66+
v-if="canRestoreRevisions"
67+
:revision="revision"
68+
:url="restoreUrl"
69+
:reference="reference"
70+
class="ltr:ml-4 rtl:mr-4"
5371
/>
54-
<Badge size="sm" color="orange" v-if="revision.attributes.current" v-text="__('Current')" />
55-
</div>
56-
57-
<revision-preview
58-
v-if="showDetails"
59-
:revision="revision"
60-
component="runway-publish-form"
61-
:component-props="componentProps"
62-
@closed="showDetails = false"
63-
>
64-
<template slot="action-buttons-right">
65-
<restore-revision
66-
v-if="canRestoreRevisions"
67-
:revision="revision"
68-
:url="restoreUrl"
69-
:reference="reference"
70-
class="ltr:ml-4 rtl:mr-4"
71-
/>
72-
</template>
73-
</revision-preview>
74-
</div>
72+
</template>
73+
</revision-preview>
7574
</div>
7675
</div>
7776
</template>
7877

7978
<script>
8079
import { DateFormatter } from '@statamic/cms';
8180
import { RestoreRevision, RevisionPreview } from '@statamic/cms/temporary';
82-
import { Subheading, Badge } from '@statamic/cms/ui';
81+
import { Subheading, Badge, Avatar } from '@statamic/cms/ui';
8382
8483
export default {
8584
components: {
8685
RevisionPreview,
8786
RestoreRevision,
8887
Subheading,
8988
Badge,
89+
Avatar,
9090
},
9191
9292
props: {
9393
revision: Object,
9494
restoreUrl: String,
9595
reference: String,
9696
canRestoreRevisions: Boolean,
97+
isLast: Boolean,
9798
},
9899
99100
data() {
@@ -111,7 +112,6 @@ export default {
111112
initialPublished: 'published',
112113
initialPermalink: 'permalink',
113114
initialIsWorkingCopy: 'hasWorkingCopy',
114-
initialIsRoot: 'isRoot',
115115
initialReadOnly: 'readOnly',
116116
canManagePublishState: 'canManagePublishState',
117117
resourceHasRoutes: 'resourceHasRoutes',
@@ -128,7 +128,7 @@ export default {
128128
129129
methods: {
130130
open() {
131-
if (this.revision.working) {
131+
if (this.revision.action === 'working') {
132132
this.$emit('working-copy-selected');
133133
return;
134134
}

src/Http/Controllers/CP/RestoreModelRevisionController.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Illuminate\Database\Eloquent\Model;
66
use Illuminate\Http\Request;
77
use Statamic\Http\Controllers\CP\CpController;
8-
use Statamic\Revisions\WorkingCopy;
98
use StatamicRadPack\Runway\Resource;
109

1110
class RestoreModelRevisionController extends CpController
@@ -18,7 +17,7 @@ public function __invoke(Request $request, Resource $resource, Model $model)
1817
}
1918

2019
if ($model->published()) {
21-
WorkingCopy::fromRevision($target)->date(now())->save();
20+
$target->toWorkingCopy()->date(now())->save();
2221
} else {
2322
$model->makeFromRevision($target)->published(false)->save();
2423
}

src/Traits/HasRunwayResource.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public function runwayRevisionUrl(Revision $revision): string
196196
return cp_route('runway.revisions.show', [
197197
'resource' => $this->runwayResource()->handle(),
198198
'model' => $this->{$this->runwayResource()->routeKey()},
199-
'revisionId' => $revision->id(),
199+
'revisionId' => $revision->date()->timestamp,
200200
]);
201201
}
202202

tests/Http/Controllers/CP/ModelRevisionsControllerTest.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,16 @@
1111

1212
class ModelRevisionsControllerTest extends TestCase
1313
{
14-
private $dir;
15-
1614
protected function setUp(): void
1715
{
1816
parent::setUp();
1917

20-
$this->dir = __DIR__.'/tmp';
2118
config(['statamic.revisions.enabled' => true]);
22-
config(['statamic.revisions.path' => $this->dir]);
2319
}
2420

2521
protected function tearDown(): void
2622
{
27-
Folder::delete($this->dir);
23+
Folder::delete(__DIR__.'/../../../__fixtures__/revisions');
2824

2925
parent::tearDown();
3026
}
@@ -61,8 +57,8 @@ public function it_gets_revisions()
6157
->assertJsonPath('0.revisions.0.attributes.data.title', 'Original title')
6258
->assertJsonPath('0.revisions.0.attributes.item_url', "http://localhost/cp/runway/post/{$model->id}/revisions/".Carbon::parse('2023-12-12 15:00:00')->timestamp)
6359

64-
->assertJsonPath('1.revisions.0.action', 'revision')
65-
->assertJsonPath('1.revisions.0.message', false)
60+
->assertJsonPath('1.revisions.0.action', 'working')
61+
->assertJsonPath('1.revisions.0.message', null)
6662
->assertJsonPath('1.revisions.0.attributes.data.title', 'Title modified in working copy')
6763
->assertJsonPath('1.revisions.0.attributes.item_url', "http://localhost/cp/runway/post/{$model->id}/revisions/".Carbon::parse('2024-01-01 10:30:00')->timestamp)
6864

tests/Http/Controllers/CP/RestoreModelRevisionController.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,16 @@
1010

1111
class RestoreModelRevisionController extends TestCase
1212
{
13-
private $dir;
14-
1513
protected function setUp(): void
1614
{
1715
parent::setUp();
1816

19-
$this->dir = __DIR__.'/tmp';
2017
config(['statamic.revisions.enabled' => true]);
21-
config(['statamic.revisions.path' => $this->dir]);
2218
}
2319

2420
protected function tearDown(): void
2521
{
26-
Folder::delete($this->dir);
22+
Folder::delete(__DIR__.'/../../../__fixtures__/revisions');
2723

2824
parent::tearDown();
2925
}
@@ -47,7 +43,7 @@ public function it_restores_revision()
4743

4844
$this
4945
->actingAs(User::make()->id('user-1')->makeSuper()->save())
50-
->post($model->runwayRestoreRevisionUrl(), ['revision' => $revision->id()])
46+
->post($model->runwayRestoreRevisionUrl(), ['revision' => $revision->date()->timestamp])
5147
->assertOk()
5248
->assertSessionHas('success');
5349

0 commit comments

Comments
 (0)