mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Merge branch 'develop' into features/inventory-import-improvements
This commit is contained in:
commit
3054a3c4ec
118
Gemfile.lock
118
Gemfile.lock
|
@ -60,47 +60,47 @@ GIT
|
||||||
GEM
|
GEM
|
||||||
remote: http://rubygems.org/
|
remote: http://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.0.8.1)
|
actioncable (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (7.0.8.1)
|
actionmailbox (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
activejob (= 7.0.8.1)
|
activejob (= 7.0.8.4)
|
||||||
activerecord (= 7.0.8.1)
|
activerecord (= 7.0.8.4)
|
||||||
activestorage (= 7.0.8.1)
|
activestorage (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
actionmailer (7.0.8.1)
|
actionmailer (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
actionview (= 7.0.8.1)
|
actionview (= 7.0.8.4)
|
||||||
activejob (= 7.0.8.1)
|
activejob (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (7.0.8.1)
|
actionpack (7.0.8.4)
|
||||||
actionview (= 7.0.8.1)
|
actionview (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
rack (~> 2.0, >= 2.2.4)
|
rack (~> 2.0, >= 2.2.4)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (7.0.8.1)
|
actiontext (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
activerecord (= 7.0.8.1)
|
activerecord (= 7.0.8.4)
|
||||||
activestorage (= 7.0.8.1)
|
activestorage (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.0.8.1)
|
actionview (7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
|
@ -110,14 +110,14 @@ GEM
|
||||||
activemodel (>= 4.1, < 7.1)
|
activemodel (>= 4.1, < 7.1)
|
||||||
case_transform (>= 0.2)
|
case_transform (>= 0.2)
|
||||||
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
||||||
activejob (7.0.8.1)
|
activejob (7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.0.8.1)
|
activemodel (7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
activerecord (7.0.8.1)
|
activerecord (7.0.8.4)
|
||||||
activemodel (= 7.0.8.1)
|
activemodel (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
activerecord-import (1.4.1)
|
activerecord-import (1.4.1)
|
||||||
activerecord (>= 4.2)
|
activerecord (>= 4.2)
|
||||||
activerecord-session_store (2.1.0)
|
activerecord-session_store (2.1.0)
|
||||||
|
@ -127,14 +127,14 @@ GEM
|
||||||
multi_json (~> 1.11, >= 1.11.2)
|
multi_json (~> 1.11, >= 1.11.2)
|
||||||
rack (>= 2.0.8, < 4)
|
rack (>= 2.0.8, < 4)
|
||||||
railties (>= 6.1)
|
railties (>= 6.1)
|
||||||
activestorage (7.0.8.1)
|
activestorage (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
activejob (= 7.0.8.1)
|
activejob (= 7.0.8.4)
|
||||||
activerecord (= 7.0.8.1)
|
activerecord (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
mini_mime (>= 1.1.0)
|
mini_mime (>= 1.1.0)
|
||||||
activesupport (7.0.8.1)
|
activesupport (7.0.8.4)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
|
@ -246,7 +246,7 @@ GEM
|
||||||
combine_pdf (1.0.23)
|
combine_pdf (1.0.23)
|
||||||
matrix
|
matrix
|
||||||
ruby-rc4 (>= 0.1.5)
|
ruby-rc4 (>= 0.1.5)
|
||||||
concurrent-ruby (1.2.3)
|
concurrent-ruby (1.3.1)
|
||||||
crack (0.4.5)
|
crack (0.4.5)
|
||||||
rexml
|
rexml
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
|
@ -370,7 +370,7 @@ GEM
|
||||||
httparty (0.21.0)
|
httparty (0.21.0)
|
||||||
mini_mime (>= 1.0.0)
|
mini_mime (>= 1.0.0)
|
||||||
multi_xml (>= 0.5.2)
|
multi_xml (>= 0.5.2)
|
||||||
i18n (1.14.1)
|
i18n (1.14.5)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-js (3.9.2)
|
i18n-js (3.9.2)
|
||||||
i18n (>= 0.6.6)
|
i18n (>= 0.6.6)
|
||||||
|
@ -439,8 +439,8 @@ GEM
|
||||||
mime-types-data (3.2023.0218.1)
|
mime-types-data (3.2023.0218.1)
|
||||||
mini_magick (4.12.0)
|
mini_magick (4.12.0)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.6)
|
mini_portile2 (2.8.7)
|
||||||
minitest (5.22.2)
|
minitest (5.23.1)
|
||||||
msgpack (1.7.1)
|
msgpack (1.7.1)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multi_test (1.1.0)
|
multi_test (1.1.0)
|
||||||
|
@ -546,8 +546,8 @@ GEM
|
||||||
puma (6.4.2)
|
puma (6.4.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
raabro (1.4.0)
|
raabro (1.4.0)
|
||||||
racc (1.7.3)
|
racc (1.8.0)
|
||||||
rack (2.2.8.1)
|
rack (2.2.9)
|
||||||
rack-attack (6.6.1)
|
rack-attack (6.6.1)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-cors (2.0.2)
|
rack-cors (2.0.2)
|
||||||
|
@ -563,20 +563,20 @@ GEM
|
||||||
rack
|
rack
|
||||||
rack-test (2.1.0)
|
rack-test (2.1.0)
|
||||||
rack (>= 1.3)
|
rack (>= 1.3)
|
||||||
rails (7.0.8.1)
|
rails (7.0.8.4)
|
||||||
actioncable (= 7.0.8.1)
|
actioncable (= 7.0.8.4)
|
||||||
actionmailbox (= 7.0.8.1)
|
actionmailbox (= 7.0.8.4)
|
||||||
actionmailer (= 7.0.8.1)
|
actionmailer (= 7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
actiontext (= 7.0.8.1)
|
actiontext (= 7.0.8.4)
|
||||||
actionview (= 7.0.8.1)
|
actionview (= 7.0.8.4)
|
||||||
activejob (= 7.0.8.1)
|
activejob (= 7.0.8.4)
|
||||||
activemodel (= 7.0.8.1)
|
activemodel (= 7.0.8.4)
|
||||||
activerecord (= 7.0.8.1)
|
activerecord (= 7.0.8.4)
|
||||||
activestorage (= 7.0.8.1)
|
activestorage (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.0.8.1)
|
railties (= 7.0.8.4)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
actionview (>= 5.0.1.rc1)
|
actionview (>= 5.0.1.rc1)
|
||||||
|
@ -597,9 +597,9 @@ GEM
|
||||||
railties (> 3.1)
|
railties (> 3.1)
|
||||||
rails_serve_static_assets (0.0.5)
|
rails_serve_static_assets (0.0.5)
|
||||||
rails_stdout_logging (0.0.5)
|
rails_stdout_logging (0.0.5)
|
||||||
railties (7.0.8.1)
|
railties (7.0.8.4)
|
||||||
actionpack (= 7.0.8.1)
|
actionpack (= 7.0.8.4)
|
||||||
activesupport (= 7.0.8.1)
|
activesupport (= 7.0.8.4)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
|
|
|
@ -141,7 +141,7 @@ class AssetSyncController < ApplicationController
|
||||||
project = assoc.protocol.in_module? ? assoc.my_module.project : nil
|
project = assoc.protocol.in_module? ? assoc.my_module.project : nil
|
||||||
when Result
|
when Result
|
||||||
type_of = :result_file_added
|
type_of = :result_file_added
|
||||||
message_items = { result: assoc }
|
message_items = { result: assoc.id }
|
||||||
project = assoc.my_module.project
|
project = assoc.my_module.project
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ class MyModulesController < ApplicationController
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
format.json do
|
format.json do
|
||||||
render json: @my_module, serializer: Lists::MyModuleSerializer, user: current_user
|
render json: @my_module, serializer: Lists::MyModuleSerializer, controller: self, user: current_user
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -122,7 +122,7 @@ class ResultsController < ApplicationController
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
name = @result.name
|
name = @result.name
|
||||||
if @result.discard
|
if @result.destroy
|
||||||
log_activity(:destroy_result, { destroyed_result: name })
|
log_activity(:destroy_result, { destroyed_result: name })
|
||||||
render json: {}, status: :ok
|
render json: {}, status: :ok
|
||||||
else
|
else
|
||||||
|
|
|
@ -8,8 +8,8 @@ const app = createApp({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
myModuleParams: null,
|
myModuleParams: null,
|
||||||
|
myModuleUrl: null,
|
||||||
tagsModalOpen: false,
|
tagsModalOpen: false,
|
||||||
tagsUrl: null
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -20,6 +20,7 @@ const app = createApp({
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
open(myModuleUrl) {
|
open(myModuleUrl) {
|
||||||
|
this.myModuleUrl = myModuleUrl;
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: myModuleUrl,
|
url: myModuleUrl,
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
|
@ -32,6 +33,7 @@ const app = createApp({
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
this.myModuleParams = null;
|
this.myModuleParams = null;
|
||||||
|
this.myModuleUrl = null;
|
||||||
this.tagsModalOpen = false;
|
this.tagsModalOpen = false;
|
||||||
},
|
},
|
||||||
syncTags(tags) {
|
syncTags(tags) {
|
||||||
|
@ -52,15 +54,13 @@ const app = createApp({
|
||||||
// Canvas
|
// Canvas
|
||||||
if ($('#canvas-container').length) {
|
if ($('#canvas-container').length) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: this.tagsUrl,
|
url: this.myModuleUrl,
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
success(data) {
|
success(data) {
|
||||||
$.each(data.my_modules, (index, myModule) => {
|
$(`div.panel[data-module-id='${data.data.id}']`)
|
||||||
$(`div.panel[data-module-id='${myModule.id}']`)
|
.find('.edit-tags-link')
|
||||||
.find('.edit-tags-link')
|
.html(data.data.attributes.tags_html);
|
||||||
.html(myModule.tags_html);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
position="right"
|
position="right"
|
||||||
@dtEvent="changeSort"
|
@dtEvent="changeSort"
|
||||||
btnIcon="sn-icon sn-icon-sort-down"
|
btnIcon="sn-icon sn-icon-sort-down"
|
||||||
:e2eSortButton="e2eSortButton"
|
:dataE2e="e2eSortButton"
|
||||||
></MenuDropdown>
|
></MenuDropdown>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
@ -85,9 +85,14 @@
|
||||||
<div :class="inRepository ? 'protocol-section protocol-information' : ''">
|
<div :class="inRepository ? 'protocol-section protocol-information' : ''">
|
||||||
<div v-if="inRepository" id="protocol-description" class="protocol-section-header">
|
<div v-if="inRepository" id="protocol-description" class="protocol-section-header">
|
||||||
<div class="protocol-description-container">
|
<div class="protocol-description-container">
|
||||||
<a class="protocol-section-caret" role="button" data-toggle="collapse" href="#protocol-description-container" aria-expanded="false" aria-controls="protocol-description-container">
|
<a class="protocol-section-caret"
|
||||||
|
role="button"
|
||||||
|
data-toggle="collapse"
|
||||||
|
href="#protocol-description-container"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="protocol-description-container">
|
||||||
<i class="sn-icon sn-icon-right"></i>
|
<i class="sn-icon sn-icon-right"></i>
|
||||||
<span id="protocolDescriptionLabel" class="protocol-section-title">
|
<span id="protocolDescriptionLabel" class="protocol-section-title" data-e2e="e2e-TX-protocolTemplates-protocolDescription-title">
|
||||||
<h2>
|
<h2>
|
||||||
{{ i18n.t("protocols.header.protocol_description") }}
|
{{ i18n.t("protocols.header.protocol_description") }}
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -95,7 +100,10 @@
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="protocol-description-container" class="text-base" :class=" inRepository ? 'protocol-description collapse in' : ''" >
|
<div id="protocol-description-container"
|
||||||
|
class="text-base"
|
||||||
|
:class=" inRepository ? 'protocol-description collapse in' : ''"
|
||||||
|
data-e2e="e2e-IF-protocolTemplates-protocolDescription-content">
|
||||||
<div v-if="urls.update_protocol_description_url">
|
<div v-if="urls.update_protocol_description_url">
|
||||||
<Tinymce
|
<Tinymce
|
||||||
:value="protocol.attributes.description"
|
:value="protocol.attributes.description"
|
||||||
|
@ -123,7 +131,7 @@
|
||||||
<div class="protocol-steps-container">
|
<div class="protocol-steps-container">
|
||||||
<a class="protocol-section-caret" role="button" data-toggle="collapse" href="#protocol-steps-container" aria-expanded="false" aria-controls="protocol-steps-container">
|
<a class="protocol-section-caret" role="button" data-toggle="collapse" href="#protocol-steps-container" aria-expanded="false" aria-controls="protocol-steps-container">
|
||||||
<i class="sn-icon sn-icon-right"></i>
|
<i class="sn-icon sn-icon-right"></i>
|
||||||
<span id="protocolStepsLabel" class="protocol-section-title">
|
<span id="protocolStepsLabel" class="protocol-section-title" data-e2e="e2e-TX-protocol-templateSteps-title">
|
||||||
<h2>
|
<h2>
|
||||||
{{ i18n.t("protocols.header.protocol_steps") }}
|
{{ i18n.t("protocols.header.protocol_steps") }}
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -137,6 +145,7 @@
|
||||||
<a
|
<a
|
||||||
class="btn btn-secondary"
|
class="btn btn-secondary"
|
||||||
:title="i18n.t('protocols.steps.new_step_title')"
|
:title="i18n.t('protocols.steps.new_step_title')"
|
||||||
|
data-e2e="e2e-BT-protocol-templateSteps-newStepTop"
|
||||||
@keyup.enter="addStep(steps.length)"
|
@keyup.enter="addStep(steps.length)"
|
||||||
@click="addStep(steps.length)"
|
@click="addStep(steps.length)"
|
||||||
tabindex="0">
|
tabindex="0">
|
||||||
|
@ -144,15 +153,16 @@
|
||||||
<span>{{ i18n.t("protocols.steps.new_step") }}</span>
|
<span>{{ i18n.t("protocols.steps.new_step") }}</span>
|
||||||
</a>
|
</a>
|
||||||
<div v-if="steps.length > 0" class="flex justify-between items-center gap-4">
|
<div v-if="steps.length > 0" class="flex justify-between items-center gap-4">
|
||||||
<button @click="collapseSteps" class="btn btn-secondary flex px-4" tabindex="0">
|
<button @click="collapseSteps" class="btn btn-secondary flex px-4" tabindex="0" data-e2e="e2e-BT-protocol-templateSteps-collapse">
|
||||||
{{ i18n.t("protocols.steps.collapse_label") }}
|
{{ i18n.t("protocols.steps.collapse_label") }}
|
||||||
</button>
|
</button>
|
||||||
<button @click="expandSteps" class="btn btn-secondary flex px-4" tabindex="0">
|
<button @click="expandSteps" class="btn btn-secondary flex px-4" tabindex="0" data-e2e="e2e-BT-protocol-templateSteps-expand">
|
||||||
{{ i18n.t("protocols.steps.expand_label") }}
|
{{ i18n.t("protocols.steps.expand_label") }}
|
||||||
</button>
|
</button>
|
||||||
<a v-if="steps.length > 0 && urls.reorder_steps_url"
|
<a v-if="steps.length > 0 && urls.reorder_steps_url"
|
||||||
class="btn btn-light icon-btn"
|
class="btn btn-light icon-btn"
|
||||||
data-toggle="modal"
|
data-toggle="modal"
|
||||||
|
data-e2e="e2e-BT-protocol-templateSteps-reorder"
|
||||||
@click="startStepReorder"
|
@click="startStepReorder"
|
||||||
@keyup.enter="startStepReorder"
|
@keyup.enter="startStepReorder"
|
||||||
:class="{'disabled': steps.length == 1}"
|
:class="{'disabled': steps.length == 1}"
|
||||||
|
@ -163,7 +173,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="protocol-steps pb-8">
|
<div class="protocol-steps pb-8">
|
||||||
<div v-for="(step, index) in steps" :key="step.id" class="step-block">
|
<div v-for="(step, index) in steps" :key="step.id" class="step-block">
|
||||||
<div v-if="index > 0 && urls.add_step_url" class="insert-step" @click="addStep(index)">
|
<div v-if="index > 0 && urls.add_step_url" class="insert-step" @click="addStep(index)" data-e2e="e2e-BT-protocol-templateSteps-insertStep">
|
||||||
<i class="sn-icon sn-icon-new-task"></i>
|
<i class="sn-icon sn-icon-new-task"></i>
|
||||||
</div>
|
</div>
|
||||||
<Step
|
<Step
|
||||||
|
@ -186,7 +196,7 @@
|
||||||
:userSettingsUrl="userSettingsUrl"
|
:userSettingsUrl="userSettingsUrl"
|
||||||
:assignableMyModuleId="protocol.attributes.assignable_my_module_id"
|
:assignableMyModuleId="protocol.attributes.assignable_my_module_id"
|
||||||
/>
|
/>
|
||||||
<div v-if="(index === steps.length - 1) && urls.add_step_url" class="insert-step" @click="addStep(index + 1)">
|
<div v-if="(index === steps.length - 1) && urls.add_step_url" class="insert-step" @click="addStep(index + 1)" data-e2e="e2e-BT-protocol-templateSteps-insertStep">
|
||||||
<i class="sn-icon sn-icon-new-task"></i>
|
<i class="sn-icon sn-icon-new-task"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -194,6 +204,7 @@
|
||||||
<a
|
<a
|
||||||
class="btn btn-secondary"
|
class="btn btn-secondary"
|
||||||
:title="i18n.t('protocols.steps.new_step_title')"
|
:title="i18n.t('protocols.steps.new_step_title')"
|
||||||
|
data-e2e="e2e-BT-protocol-templateSteps-newStepBottom"
|
||||||
@keyup.enter="addStep(steps.length)"
|
@keyup.enter="addStep(steps.length)"
|
||||||
@click="addStep(steps.length)"
|
@click="addStep(steps.length)"
|
||||||
tabindex="0">
|
tabindex="0">
|
||||||
|
|
|
@ -1,32 +1,33 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="protocol-section protocol-information mb-4">
|
<div class="protocol-section protocol-information mb-4" data-e2e="e2e-CO-protocolTemplates-protocolDetails">
|
||||||
<div id="protocol-details" class="protocol-section-header">
|
<div id="protocol-details" class="protocol-section-header">
|
||||||
<div class="protocol-details-container">
|
<div class="protocol-details-container">
|
||||||
<a class="protocol-section-caret" role="button" data-toggle="collapse"
|
<a class="protocol-section-caret" role="button" data-toggle="collapse"
|
||||||
href="#details-container" aria-expanded="false" aria-controls="details-container">
|
href="#details-container" aria-expanded="false" aria-controls="details-container">
|
||||||
<i class="sn-icon sn-icon-right"></i>
|
<i class="sn-icon sn-icon-right"></i>
|
||||||
<span id="protocolDetailsLabel" class="protocol-section-title">
|
<span id="protocolDetailsLabel" class="protocol-section-title">
|
||||||
<h2>
|
<h2 data-e2e="e2e-TX-protocolTemplates-protocolDetails-title">
|
||||||
{{ i18n.t("protocols.header.details") }}
|
{{ i18n.t("protocols.header.details") }}
|
||||||
</h2>
|
</h2>
|
||||||
<span class="protocol-code" >{{ protocol.attributes.code }}</span>
|
<span class="protocol-code" data-e2e="e2e-TX-protocolTemplates-protocolDetails-protocolId">{{ protocol.attributes.code }}</span>
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions-block">
|
<div class="actions-block">
|
||||||
<a class="btn btn-light icon-btn pull-right"
|
<a class="btn btn-light icon-btn pull-right"
|
||||||
:href="protocol.attributes.urls.print_protocol_url" target="_blank">
|
:href="protocol.attributes.urls.print_protocol_url" target="_blank"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-protocolDetails-print">
|
||||||
<span class="sn-icon sn-icon-printer" aria-hidden="true"></span>
|
<span class="sn-icon sn-icon-printer" aria-hidden="true"></span>
|
||||||
</a>
|
</a>
|
||||||
<button class="btn btn-light" @click="openVersionsModal">
|
<button class="btn btn-light" @click="openVersionsModal" data-e2e="e2e-BT-protocolTemplates-protocolDetails-versions">
|
||||||
{{ i18n.t("protocols.header.versions") }}
|
{{ i18n.t("protocols.header.versions") }}
|
||||||
</button>
|
</button>
|
||||||
<button v-if="protocol.attributes.urls.publish_url"
|
<button v-if="protocol.attributes.urls.publish_url"
|
||||||
@click="$emit('publish')" class="btn btn-primary">
|
@click="$emit('publish')" class="btn btn-primary" data-e2e="e2e-BT-protocolTemplates-protocolDetails-publish">
|
||||||
{{ i18n.t("protocols.header.publish") }}</button>
|
{{ i18n.t("protocols.header.publish") }}</button>
|
||||||
<button v-if="protocol.attributes.urls.save_as_draft_url"
|
<button v-if="protocol.attributes.urls.save_as_draft_url"
|
||||||
:disabled="protocol.attributes.has_draft || creatingDraft"
|
:disabled="protocol.attributes.has_draft || creatingDraft"
|
||||||
@click="saveAsdraft" class="btn btn-secondary">
|
@click="saveAsdraft" class="btn btn-secondary" data-e2e="e2e-BT-protocolTemplates-protocolDetails-saveAsDraft">
|
||||||
{{ i18n.t("protocols.header.save_as_draft") }}
|
{{ i18n.t("protocols.header.save_as_draft") }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -34,33 +35,33 @@
|
||||||
<div id="details-container" class="protocol-details collapse in">
|
<div id="details-container" class="protocol-details collapse in">
|
||||||
<div class="protocol-metadata">
|
<div class="protocol-metadata">
|
||||||
<p class="data-block">
|
<p class="data-block">
|
||||||
<span>{{ i18n.t("protocols.header.version") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-versionLabel">{{ i18n.t("protocols.header.version") }}</span>
|
||||||
<b>{{ titleVersion }}</b>
|
<b data-e2e="e2e-TX-protocolTemplates-protocolDetails-version">{{ titleVersion }}</b>
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block" v-if="protocol.attributes.published">
|
<p class="data-block" v-if="protocol.attributes.published">
|
||||||
<span>{{ i18n.t("protocols.header.published_on") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedOnLabel">{{ i18n.t("protocols.header.published_on") }}</span>
|
||||||
<b>{{ protocol.attributes.published_on_formatted }}</b>
|
<b data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedOn">{{ protocol.attributes.published_on_formatted }}</b>
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block" v-if="protocol.attributes.published">
|
<p class="data-block" v-if="protocol.attributes.published" data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedBy">
|
||||||
<span>{{ i18n.t("protocols.header.published_by") }}</span>
|
<span>{{ i18n.t("protocols.header.published_by") }}</span>
|
||||||
<img :src="protocol.attributes.published_by.avatar" class="rounded-full"/>
|
<img :src="protocol.attributes.published_by.avatar" class="rounded-full"/>
|
||||||
{{ protocol.attributes.published_by.name }}
|
{{ protocol.attributes.published_by.name }}
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block">
|
<p class="data-block">
|
||||||
<span>{{ i18n.t("protocols.header.updated_at") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-updatedAtLabel">{{ i18n.t("protocols.header.updated_at") }}</span>
|
||||||
<b>{{ protocol.attributes.updated_at_formatted }}</b>
|
<b data-e2e="e2e-TX-protocolTemplates-protocolDetails-updatedAt">{{ protocol.attributes.updated_at_formatted }}</b>
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block">
|
<p class="data-block">
|
||||||
<span>{{ i18n.t("protocols.header.created_at") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdAtLabel">{{ i18n.t("protocols.header.created_at") }}</span>
|
||||||
<b>{{ protocol.attributes.created_at_formatted }}</b>
|
<b data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdAt">{{ protocol.attributes.created_at_formatted }}</b>
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block">
|
<p class="data-block" data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdBy">
|
||||||
<span>{{ i18n.t("protocols.header.added_by") }}</span>
|
<span>{{ i18n.t("protocols.header.added_by") }}</span>
|
||||||
<img :src="protocol.attributes.added_by.avatar" class="rounded-full"/>
|
<img :src="protocol.attributes.added_by.avatar" class="rounded-full"/>
|
||||||
{{ protocol.attributes.added_by.name }}
|
{{ protocol.attributes.added_by.name }}
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block authors-data">
|
<p class="data-block authors-data">
|
||||||
<span>{{ i18n.t("protocols.header.authors") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-authorsLabel">{{ i18n.t("protocols.header.authors") }}</span>
|
||||||
<span class="authors-list" v-if="protocol.attributes.urls.update_protocol_authors_url">
|
<span class="authors-list" v-if="protocol.attributes.urls.update_protocol_authors_url">
|
||||||
<InlineEdit
|
<InlineEdit
|
||||||
:value="protocol.attributes.authors"
|
:value="protocol.attributes.authors"
|
||||||
|
@ -68,15 +69,16 @@
|
||||||
:allowBlank="true"
|
:allowBlank="true"
|
||||||
:attributeName="`${i18n.t('Protocol')} ${i18n.t('protocols.header.authors_list')}`"
|
:attributeName="`${i18n.t('Protocol')} ${i18n.t('protocols.header.authors_list')}`"
|
||||||
:characterLimit="10000"
|
:characterLimit="10000"
|
||||||
|
:dataE2e="'protocolTemplates-protocolDetails-authors'"
|
||||||
@update="updateAuthors"
|
@update="updateAuthors"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
<span class="authors-list" v-else>
|
<span class="authors-list" data-e2e="e2e-TX-protocolTemplates-protocolDetails-authorsPublished" v-else>
|
||||||
{{ protocol.attributes.authors }}
|
{{ protocol.attributes.authors }}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="data-block keywords-data">
|
<p class="data-block keywords-data">
|
||||||
<span>{{ i18n.t("protocols.header.keywords") }}</span>
|
<span data-e2e="e2e-TX-protocolTemplates-protocolDetails-keywordsLabel">{{ i18n.t("protocols.header.keywords") }}</span>
|
||||||
<span
|
<span
|
||||||
class="keywords-list"
|
class="keywords-list"
|
||||||
v-if="protocol.attributes.urls.update_protocol_authors_url || protocol.attributes.keywords.length">
|
v-if="protocol.attributes.urls.update_protocol_authors_url || protocol.attributes.keywords.length">
|
||||||
|
@ -90,6 +92,7 @@
|
||||||
:noEmptyOption="false"
|
:noEmptyOption="false"
|
||||||
:selectAppearance="'tag'"
|
:selectAppearance="'tag'"
|
||||||
:viewMode="protocol.attributes.urls.update_protocol_keywords_url == null"
|
:viewMode="protocol.attributes.urls.update_protocol_keywords_url == null"
|
||||||
|
:dataE2e="'protocolTemplates-protocolDetails-keywords'"
|
||||||
@dropdown:changed="updateKeywords"
|
@dropdown:changed="updateKeywords"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
|
@ -117,7 +120,7 @@ export default {
|
||||||
protocol: {
|
protocol: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
@dragover.prevent
|
@dragover.prevent
|
||||||
:data-id="step.id"
|
:data-id="step.id"
|
||||||
:class="{ 'draging-file': dragingFile, 'editing-name': editingName, 'locked': !urls.update_url, 'pointer-events-none': addingContent }"
|
:class="{ 'draging-file': dragingFile, 'editing-name': editingName, 'locked': !urls.update_url, 'pointer-events-none': addingContent }"
|
||||||
|
:data-e2e="`e2e-CO-protocol-step${step.id}`"
|
||||||
>
|
>
|
||||||
<div class="drop-message" @dragleave.prevent="!showFileModal ? dragingFile = false : null">
|
<div class="drop-message" @dragleave.prevent="!showFileModal ? dragingFile = false : null">
|
||||||
{{ i18n.t('protocols.steps.drop_message', { position: step.attributes.position + 1 }) }}
|
{{ i18n.t('protocols.steps.drop_message', { position: step.attributes.position + 1 }) }}
|
||||||
|
@ -18,7 +19,8 @@
|
||||||
:href="'#stepBody' + step.id"
|
:href="'#stepBody' + step.id"
|
||||||
data-toggle="collapse"
|
data-toggle="collapse"
|
||||||
data-remote="true"
|
data-remote="true"
|
||||||
@click="toggleCollapsed">
|
@click="toggleCollapsed"
|
||||||
|
:data-e2e="`e2e-BT-protocol-step${step.id}-toggleCollapsed`">
|
||||||
<span class="sn-icon sn-icon-right "></span>
|
<span class="sn-icon sn-icon-right "></span>
|
||||||
</a>
|
</a>
|
||||||
<div v-if="!inRepository" class="step-complete-container" :class="{ 'step-element--locked': !urls.state_url }">
|
<div v-if="!inRepository" class="step-complete-container" :class="{ 'step-element--locked': !urls.state_url }">
|
||||||
|
@ -27,9 +29,10 @@
|
||||||
@keyup.enter="changeState"
|
@keyup.enter="changeState"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
:title="step.attributes.completed ? i18n.t('protocols.steps.status.uncomplete') : i18n.t('protocols.steps.status.complete')"
|
:title="step.attributes.completed ? i18n.t('protocols.steps.status.uncomplete') : i18n.t('protocols.steps.status.complete')"
|
||||||
|
:data-e2e="`e2e-BT-protocol-step${step.id}-toggleCompleted`"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="step-position leading-5">
|
<div class="step-position leading-5" :data-e2e="`e2e-TX-protocol-step${step.id}-position`">
|
||||||
{{ step.attributes.position + 1 }}.
|
{{ step.attributes.position + 1 }}.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -48,6 +51,7 @@
|
||||||
@editingEnabled="editingName = true"
|
@editingEnabled="editingName = true"
|
||||||
@editingDisabled="editingName = false"
|
@editingDisabled="editingName = false"
|
||||||
:editOnload="step.newStep == true"
|
:editOnload="step.newStep == true"
|
||||||
|
:dataE2e="`protocol-step${step.id}-title`"
|
||||||
@update="updateName"
|
@update="updateName"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -60,6 +64,7 @@
|
||||||
:btnText="i18n.t('protocols.steps.insert.button')"
|
:btnText="i18n.t('protocols.steps.insert.button')"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:caret="true"
|
:caret="true"
|
||||||
|
:dataE2e="`e2e-DD-protocol-step${step.id}-insertContent`"
|
||||||
@create:table="(...args) => this.createElement('table', ...args)"
|
@create:table="(...args) => this.createElement('table', ...args)"
|
||||||
@create:checklist="createElement('checklist')"
|
@create:checklist="createElement('checklist')"
|
||||||
@create:text="createElement('text')"
|
@create:text="createElement('text')"
|
||||||
|
@ -98,6 +103,7 @@
|
||||||
:btnClasses="'btn btn-light icon-btn'"
|
:btnClasses="'btn btn-light icon-btn'"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:btnIcon="'sn-icon sn-icon-more-hori'"
|
:btnIcon="'sn-icon sn-icon-more-hori'"
|
||||||
|
:dataE2e="`e2e-DD-protocol-step${step.id}-options`"
|
||||||
@reorder="openReorderModal"
|
@reorder="openReorderModal"
|
||||||
@duplicate="duplicateStep"
|
@duplicate="duplicateStep"
|
||||||
@delete="showDeleteModal"
|
@delete="showDeleteModal"
|
||||||
|
@ -116,6 +122,7 @@
|
||||||
:reorderElementUrl="elements.length > 1 ? urls.reorder_elements_url : ''"
|
:reorderElementUrl="elements.length > 1 ? urls.reorder_elements_url : ''"
|
||||||
:assignableMyModuleId="assignableMyModuleId"
|
:assignableMyModuleId="assignableMyModuleId"
|
||||||
:isNew="element.isNew"
|
:isNew="element.isNew"
|
||||||
|
:dataE2e="`protocol-step${step.id}`"
|
||||||
@component:adding-content="($event) => addingContent = $event"
|
@component:adding-content="($event) => addingContent = $event"
|
||||||
@component:delete="deleteElement"
|
@component:delete="deleteElement"
|
||||||
@update="updateElement"
|
@update="updateElement"
|
||||||
|
@ -127,6 +134,7 @@
|
||||||
:parent="step"
|
:parent="step"
|
||||||
:attachments="attachments"
|
:attachments="attachments"
|
||||||
:attachmentsReady="attachmentsReady"
|
:attachmentsReady="attachmentsReady"
|
||||||
|
:dataE2e="`protocol-step${step.id}`"
|
||||||
@attachments:openFileModal="showFileModal = true"
|
@attachments:openFileModal="showFileModal = true"
|
||||||
@attachment:deleted="attachmentDeleted"
|
@attachment:deleted="attachmentDeleted"
|
||||||
@attachment:update="updateAttachment"
|
@attachment:update="updateAttachment"
|
||||||
|
@ -142,6 +150,7 @@
|
||||||
<ReorderableItemsModal v-if="reordering"
|
<ReorderableItemsModal v-if="reordering"
|
||||||
:title="i18n.t('protocols.steps.modals.reorder_elements.title', { step_position: step.attributes.position + 1 })"
|
:title="i18n.t('protocols.steps.modals.reorder_elements.title', { step_position: step.attributes.position + 1 })"
|
||||||
:items="reorderableElements"
|
:items="reorderableElements"
|
||||||
|
:dataE2e="`e2e-BT-protocol-step${step.id}-reorder`"
|
||||||
@reorder="updateElementOrder"
|
@reorder="updateElementOrder"
|
||||||
@close="closeReorderModal"
|
@close="closeReorderModal"
|
||||||
/>
|
/>
|
||||||
|
@ -215,13 +224,34 @@
|
||||||
editingName: false,
|
editingName: false,
|
||||||
inlineEditError: null,
|
inlineEditError: null,
|
||||||
wellPlateOptions: [
|
wellPlateOptions: [
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.32_x_48'), emit: 'create:table', params: [32, 48] },
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.32_x_48'),
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.16_x_24'), emit: 'create:table', params: [16, 24] },
|
emit: 'create:table',
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.8_x_12'), emit: 'create:table', params: [8, 12] },
|
params: [32, 48],
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.6_x_8'), emit: 'create:table', params: [6, 8] },
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-32` },
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.4_x_6'), emit: 'create:table', params: [4, 6] },
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.16_x_24'),
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.3_x_4'), emit: 'create:table', params: [3, 4]},
|
emit: 'create:table',
|
||||||
{ text: I18n.t('protocols.steps.insert.well_plate_options.2_x_3'), emit: 'create:table', params: [2, 3] }
|
params: [16, 24],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-16` },
|
||||||
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.8_x_12'),
|
||||||
|
emit: 'create:table',
|
||||||
|
params: [8, 12],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-8` },
|
||||||
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.6_x_8'),
|
||||||
|
emit: 'create:table',
|
||||||
|
params: [6, 8],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-6` },
|
||||||
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.4_x_6'),
|
||||||
|
emit: 'create:table',
|
||||||
|
params: [4, 6],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-4` },
|
||||||
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.3_x_4'),
|
||||||
|
emit: 'create:table',
|
||||||
|
params: [3, 4],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-3` },
|
||||||
|
{ text: I18n.t('protocols.steps.insert.well_plate_options.2_x_3'),
|
||||||
|
emit: 'create:table',
|
||||||
|
params: [2, 3],
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellPlate-2` }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -288,25 +318,29 @@
|
||||||
if (this.urls.upload_attachment_url) {
|
if (this.urls.upload_attachment_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('protocols.steps.insert.add_file'),
|
text: this.i18n.t('protocols.steps.insert.add_file'),
|
||||||
emit: 'create:file'
|
emit: 'create:file',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertAttachment-file`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
if (this.step.attributes.wopi_enabled) {
|
if (this.step.attributes.wopi_enabled) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('assets.create_wopi_file.button_text'),
|
text: this.i18n.t('assets.create_wopi_file.button_text'),
|
||||||
emit: 'create:wopi_file'
|
emit: 'create:wopi_file',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertAttachment-wopi`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
if (this.step.attributes.open_vector_editor_context.new_sequence_asset_url) {
|
if (this.step.attributes.open_vector_editor_context.new_sequence_asset_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('open_vector_editor.new_sequence_file'),
|
text: this.i18n.t('open_vector_editor.new_sequence_file'),
|
||||||
emit: 'create:ove_file'
|
emit: 'create:ove_file',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertAttachment-sequence`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
if (this.step.attributes.marvinjs_enabled) {
|
if (this.step.attributes.marvinjs_enabled) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('marvinjs.new_button'),
|
text: this.i18n.t('marvinjs.new_button'),
|
||||||
emit: 'create:marvinjs_file'
|
emit: 'create:marvinjs_file',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertAttachment-chemicalDrawing`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
return menu;
|
return menu;
|
||||||
|
@ -316,21 +350,26 @@
|
||||||
if (this.urls.update_url) {
|
if (this.urls.update_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('protocols.steps.insert.text'),
|
text: this.i18n.t('protocols.steps.insert.text'),
|
||||||
emit: 'create:text'
|
emit: 'create:text',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertText`
|
||||||
},{
|
},{
|
||||||
text: this.i18n.t('protocols.steps.insert.attachment'),
|
text: this.i18n.t('protocols.steps.insert.attachment'),
|
||||||
submenu: this.filesMenu,
|
submenu: this.filesMenu,
|
||||||
position: 'left'
|
position: 'left',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertAttachment`
|
||||||
},{
|
},{
|
||||||
text: this.i18n.t('protocols.steps.insert.table'),
|
text: this.i18n.t('protocols.steps.insert.table'),
|
||||||
emit: 'create:table'
|
emit: 'create:table',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertTable`
|
||||||
},{
|
},{
|
||||||
text: this.i18n.t('protocols.steps.insert.well_plate'),
|
text: this.i18n.t('protocols.steps.insert.well_plate'),
|
||||||
submenu: this.wellPlateOptions,
|
submenu: this.wellPlateOptions,
|
||||||
position: 'left'
|
position: 'left',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertWellplate`
|
||||||
},{
|
},{
|
||||||
text: this.i18n.t('protocols.steps.insert.checklist'),
|
text: this.i18n.t('protocols.steps.insert.checklist'),
|
||||||
emit: 'create:checklist'
|
emit: 'create:checklist',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-insertChecklist`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,19 +380,22 @@
|
||||||
if (this.urls.reorder_elements_url) {
|
if (this.urls.reorder_elements_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('protocols.steps.options_dropdown.rearrange'),
|
text: this.i18n.t('protocols.steps.options_dropdown.rearrange'),
|
||||||
emit: 'reorder'
|
emit: 'reorder',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-stepOptions-rearrange`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
if (this.urls.duplicate_step_url) {
|
if (this.urls.duplicate_step_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('protocols.steps.options_dropdown.duplicate'),
|
text: this.i18n.t('protocols.steps.options_dropdown.duplicate'),
|
||||||
emit: 'duplicate'
|
emit: 'duplicate',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-stepOptions-duplicate`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
if (this.urls.delete_url) {
|
if (this.urls.delete_url) {
|
||||||
menu = menu.concat([{
|
menu = menu.concat([{
|
||||||
text: this.i18n.t('protocols.steps.options_dropdown.delete'),
|
text: this.i18n.t('protocols.steps.options_dropdown.delete'),
|
||||||
emit: 'delete'
|
emit: 'delete',
|
||||||
|
data_e2e: `e2e-BT-protocol-step${this.step.id}-stepOptions-delete`
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -2,31 +2,32 @@
|
||||||
<div ref="modal" class="modal" tabindex="-1" role="dialog">
|
<div ref="modal" class="modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
<form @submit.prevent="submit">
|
<form @submit.prevent="submit">
|
||||||
<div class="modal-content">
|
<div class="modal-content" data-e2e="e2e-MD-newProtocol">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close" data-e2e="e2e-BT-newProtocolModal-close">
|
||||||
<i class="sn-icon sn-icon-close"></i>
|
<i class="sn-icon sn-icon-close"></i>
|
||||||
</button>
|
</button>
|
||||||
<h4 class="modal-title truncate !block" id="edit-project-modal-label">
|
<h4 class="modal-title truncate !block" id="edit-project-modal-label" data-e2e="e2e-TX-newProtocolModal-title">
|
||||||
{{ i18n.t("protocols.new_protocol_modal.title_new") }}
|
{{ i18n.t("protocols.new_protocol_modal.title_new") }}
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
<label class="sci-label">{{ i18n.t("protocols.new_protocol_modal.name_label") }}</label>
|
<label class="sci-label" data-e2e="e2e-TX-newProtocolModal-inputLabel">{{ i18n.t("protocols.new_protocol_modal.name_label") }}</label>
|
||||||
<div class="sci-input-container-v2" :class="{'error': error}" :data-error="error">
|
<div class="sci-input-container-v2" :class="{'error': error}" :data-error="error">
|
||||||
<input type="text" v-model="name"
|
<input type="text" v-model="name"
|
||||||
class="sci-input-field"
|
class="sci-input-field"
|
||||||
autofocus="true" ref="input"
|
autofocus="true" ref="input"
|
||||||
|
data-e2e="e2e-IF-newProtocolModal-name"
|
||||||
:placeholder="i18n.t('protocols.new_protocol_modal.name_placeholder')" />
|
:placeholder="i18n.t('protocols.new_protocol_modal.name_placeholder')" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2 text-xs items-center">
|
<div class="flex gap-2 text-xs items-center">
|
||||||
<div class="sci-checkbox-container">
|
<div class="sci-checkbox-container">
|
||||||
<input type="checkbox" class="sci-checkbox" v-model="visible" value="visible"/>
|
<input type="checkbox" class="sci-checkbox" v-model="visible" value="visible" data-e2e="e2e-CB-newProtocolModal-grantAccess"/>
|
||||||
<span class="sci-checkbox-label"></span>
|
<span class="sci-checkbox-label"></span>
|
||||||
</div>
|
</div>
|
||||||
<span v-html="i18n.t('protocols.new_protocol_modal.access_label')"></span>
|
<span v-html="i18n.t('protocols.new_protocol_modal.access_label')" data-e2e="e2e-TX-newProtocolModal-grantAccess"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-6" :class="{'hidden': !visible}">
|
<div class="mt-6" :class="{'hidden': !visible}">
|
||||||
<label class="sci-label">{{ i18n.t("protocols.new_protocol_modal.role_label") }}</label>
|
<label class="sci-label">{{ i18n.t("protocols.new_protocol_modal.role_label") }}</label>
|
||||||
|
@ -34,8 +35,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ i18n.t('general.cancel') }}</button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal" data-e2e="e2e-BT-newProtocolModal-cancel">{{ i18n.t('general.cancel') }}</button>
|
||||||
<button class="btn btn-primary" type="submit" :disabled="visible && !defaultRole">
|
<button class="btn btn-primary" type="submit" :disabled="visible && !defaultRole" data-e2e="e2e-BT-newProtocolModal-create">
|
||||||
{{ i18n.t('protocols.new_protocol_modal.create_new') }}
|
{{ i18n.t('protocols.new_protocol_modal.create_new') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -203,7 +203,8 @@ export default {
|
||||||
menuItems: [
|
menuItems: [
|
||||||
{
|
{
|
||||||
emit: 'import_file',
|
emit: 'import_file',
|
||||||
text: this.i18n.t('protocols.index.import_eln')
|
text: this.i18n.t('protocols.index.import_eln'),
|
||||||
|
data_e2e: 'e2e-BT-topToolbar-importEln'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
@ -214,13 +215,15 @@ export default {
|
||||||
text: `<span>${this.i18n.t('protocols.index.import_docx')}</span>
|
text: `<span>${this.i18n.t('protocols.index.import_docx')}</span>
|
||||||
<span class="bg-sn-coral text-sn-white text-[8px] absolute leading-none p-1 top-px rounded-[1px] right-px">
|
<span class="bg-sn-coral text-sn-white text-[8px] absolute leading-none p-1 top-px rounded-[1px] right-px">
|
||||||
${this.i18n.t('protocols.index.beta')}
|
${this.i18n.t('protocols.index.beta')}
|
||||||
</span>`
|
</span>`,
|
||||||
|
data_e2e: 'e2e-BT-topToolbar-importDocx'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
importMenu.menuItems.push({
|
importMenu.menuItems.push({
|
||||||
emit: 'import_protocols_io',
|
emit: 'import_protocols_io',
|
||||||
text: this.i18n.t('protocols.index.import_protocols_io')
|
text: this.i18n.t('protocols.index.import_protocols_io'),
|
||||||
|
data_e2e: 'e2e-BT-topToolbar-importProtocolsIo'
|
||||||
});
|
});
|
||||||
|
|
||||||
left.push(importMenu);
|
left.push(importMenu);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="content__attachments pr-8" :id='"content__attachments-" + parent.id'>
|
<div class="content__attachments pr-8"
|
||||||
|
:id='"content__attachments-" + parent.id'
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-attachments`">
|
||||||
<div class="sci-divider my-6"></div>
|
<div class="sci-divider my-6"></div>
|
||||||
<div class="content__attachments-actions">
|
<div class="content__attachments-actions">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
|
@ -11,6 +13,7 @@
|
||||||
:btnText="i18n.t('attachments.preview_menu')"
|
:btnText="i18n.t('attachments.preview_menu')"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:caret="true"
|
:caret="true"
|
||||||
|
:data_e2e="`e2e-DD-${dataE2e}-attachments-viewOptions`"
|
||||||
@attachment:viewMode = "changeAttachmentsViewMode"
|
@attachment:viewMode = "changeAttachmentsViewMode"
|
||||||
></MenuDropdown>
|
></MenuDropdown>
|
||||||
<MenuDropdown
|
<MenuDropdown
|
||||||
|
@ -18,6 +21,7 @@
|
||||||
:btnIcon="'sn-icon sn-icon-sort-down'"
|
:btnIcon="'sn-icon sn-icon-sort-down'"
|
||||||
:btnClasses="'btn btn-light icon-btn'"
|
:btnClasses="'btn btn-light icon-btn'"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
|
:data_e2e="`e2e-DD-${dataE2e}-attachments-orderOptions`"
|
||||||
@attachment:order = "changeAttachmentsOrder"
|
@attachment:order = "changeAttachmentsOrder"
|
||||||
></MenuDropdown>
|
></MenuDropdown>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,6 +33,7 @@
|
||||||
:is="attachment_view_mode(attachmentsOrdered[index])"
|
:is="attachment_view_mode(attachmentsOrdered[index])"
|
||||||
:attachment="attachment"
|
:attachment="attachment"
|
||||||
:parentId="parseInt(parent.id)"
|
:parentId="parseInt(parent.id)"
|
||||||
|
:dataE2e="`${dataE2e}`"
|
||||||
@attachment:viewMode="updateAttachmentViewMode"
|
@attachment:viewMode="updateAttachmentViewMode"
|
||||||
@attachment:delete="deleteAttachment(attachment.id)"
|
@attachment:delete="deleteAttachment(attachment.id)"
|
||||||
@attachment:moved="attachmentMoved"
|
@attachment:moved="attachmentMoved"
|
||||||
|
@ -64,6 +69,10 @@ export default {
|
||||||
attachmentsReady: {
|
attachmentsReady: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -119,7 +128,8 @@ export default {
|
||||||
active: this.parent.attributes.assets_view_mode == viewMode,
|
active: this.parent.attributes.assets_view_mode == viewMode,
|
||||||
text: this.i18n.t(`attachments.view_mode.${viewMode}_html`),
|
text: this.i18n.t(`attachments.view_mode.${viewMode}_html`),
|
||||||
emit: 'attachment:viewMode',
|
emit: 'attachment:viewMode',
|
||||||
params: viewMode
|
params: viewMode,
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-viewOptions-${viewMode}`
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return menu;
|
return menu;
|
||||||
|
@ -131,7 +141,8 @@ export default {
|
||||||
text: this.i18n.t(`general.sort_new.${orderOption}`),
|
text: this.i18n.t(`general.sort_new.${orderOption}`),
|
||||||
emit: 'attachment:order',
|
emit: 'attachment:order',
|
||||||
params: orderOption,
|
params: orderOption,
|
||||||
active: this.parent.attributes.assets_order === orderOption
|
active: this.parent.attributes.assets_order === orderOption,
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-orderOptions-${orderOption}`
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="attachment-container asset" :data-asset-id="attachment.id">
|
<div class="attachment-container asset"
|
||||||
|
:data-asset-id="attachment.id"
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-attachment${attachment.id}-empty`">
|
||||||
<div
|
<div
|
||||||
class="file-name"
|
class="file-name"
|
||||||
:id="`modal_link${attachment.id}`"
|
:id="`modal_link${attachment.id}`"
|
||||||
|
@ -23,6 +25,10 @@ export default {
|
||||||
parentId: {
|
parentId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
<div
|
<div
|
||||||
class="inline-attachment-container asset"
|
class="inline-attachment-container asset"
|
||||||
:class="[{'menu-dropdown-open': isMenuDropdownOpen}, {'context-menu-open': isContextMenuOpen }]"
|
:class="[{'menu-dropdown-open': isMenuDropdownOpen}, {'context-menu-open': isContextMenuOpen }]"
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-attachment${attachment.id}-inline`"
|
||||||
ref="inlineAttachmentContainer"
|
ref="inlineAttachmentContainer"
|
||||||
:data-asset-id="attachment.id"
|
:data-asset-id="attachment.id"
|
||||||
>
|
>
|
||||||
|
@ -104,6 +105,10 @@ export default {
|
||||||
parentId: {
|
parentId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="list-attachment-container asset"
|
<div class="list-attachment-container asset"
|
||||||
:data-asset-id="attachment.id"
|
:data-asset-id="attachment.id"
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-attachment${attachment.id}-list`"
|
||||||
>
|
>
|
||||||
<i class="text-sn-grey asset-icon sn-icon" :class="attachment.attributes.icon"></i>
|
<i class="text-sn-grey asset-icon sn-icon" :class="attachment.attributes.icon"></i>
|
||||||
<a :href="attachment.attributes.urls.blob"
|
<a :href="attachment.attributes.urls.blob"
|
||||||
|
@ -72,6 +73,10 @@ export default {
|
||||||
parentId: {
|
parentId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
@mouseenter="handleMouseEnter"
|
@mouseenter="handleMouseEnter"
|
||||||
@mouseleave="handleMouseLeave"
|
@mouseleave="handleMouseLeave"
|
||||||
v-click-outside="handleClickOutsideThumbnail"
|
v-click-outside="handleClickOutsideThumbnail"
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-attachment${attachment.id}-thumbnail`"
|
||||||
>
|
>
|
||||||
<a :class="{ hidden: showOptions }"
|
<a :class="{ hidden: showOptions }"
|
||||||
:href="attachment.attributes.urls.blob"
|
:href="attachment.attributes.urls.blob"
|
||||||
|
@ -101,7 +102,10 @@
|
||||||
>
|
>
|
||||||
<i class="sn-icon sn-icon-open"></i>
|
<i class="sn-icon sn-icon-open"></i>
|
||||||
</a>
|
</a>
|
||||||
<a v-if="attachment.attributes.urls.move" @click.prevent.stop="showMoveModal" class="btn btn-light icon-btn thumbnail-action-btn" :title="i18n.t('attachments.thumbnail.buttons.move')">
|
<a v-if="attachment.attributes.urls.move"
|
||||||
|
@click.prevent.stop="showMoveModal"
|
||||||
|
class="btn btn-light icon-btn thumbnail-action-btn"
|
||||||
|
:title="i18n.t('attachments.thumbnail.buttons.move')">
|
||||||
<i class="sn-icon sn-icon-move"></i>
|
<i class="sn-icon sn-icon-move"></i>
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-light icon-btn thumbnail-action-btn"
|
<a class="btn btn-light icon-btn thumbnail-action-btn"
|
||||||
|
@ -210,6 +214,10 @@ export default {
|
||||||
parentId: {
|
parentId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -252,7 +260,7 @@ export default {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
$(this.$nextTick(() => {
|
$(this.$nextTick(() => {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="content__checklist-container pr-8" >
|
<div class="content__checklist-container pr-8" :data-e2e="`e2e-CO-${dataE2e}-checklist${element.id}`">
|
||||||
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
||||||
<div class="checklist-header flex rounded mb-1 items-center relative w-full group/checklist-header" :class="{ 'editing-name': editingName, 'locked': !element.attributes.orderable.urls.update_url }">
|
<div class="checklist-header flex rounded mb-1 items-center relative w-full group/checklist-header"
|
||||||
|
:class="{ 'editing-name': editingName, 'locked': !element.attributes.orderable.urls.update_url }">
|
||||||
<div class="grow-1 text-ellipsis whitespace-nowrap grow my-1 font-bold">
|
<div class="grow-1 text-ellipsis whitespace-nowrap grow my-1 font-bold">
|
||||||
<InlineEdit
|
<InlineEdit
|
||||||
:class="{ 'pointer-events-none': !element.attributes.orderable.urls.update_url }"
|
:class="{ 'pointer-events-none': !element.attributes.orderable.urls.update_url }"
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
:autofocus="editingName"
|
:autofocus="editingName"
|
||||||
:smartAnnotation="true"
|
:smartAnnotation="true"
|
||||||
:attributeName="`${i18n.t('Checklist')} ${i18n.t('name')}`"
|
:attributeName="`${i18n.t('Checklist')} ${i18n.t('name')}`"
|
||||||
|
:dataE2e="`${dataE2e}-checklist${element.id}`"
|
||||||
@editingEnabled="editingName = true"
|
@editingEnabled="editingName = true"
|
||||||
@editingDisabled="editingName = false"
|
@editingDisabled="editingName = false"
|
||||||
@update="updateName"
|
@update="updateName"
|
||||||
|
@ -24,6 +26,7 @@
|
||||||
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:btnIcon="'sn-icon sn-icon-more-hori'"
|
:btnIcon="'sn-icon sn-icon-more-hori'"
|
||||||
|
:dataE2e="`e2e-DD-${dataE2e}-checklist${element.id}-options`"
|
||||||
@edit="editingName = true"
|
@edit="editingName = true"
|
||||||
@duplicate="duplicateElement"
|
@duplicate="duplicateElement"
|
||||||
@move="showMoveModal"
|
@move="showMoveModal"
|
||||||
|
@ -51,6 +54,7 @@
|
||||||
:reorderChecklistItemUrl="this.element.attributes.orderable.urls.reorder_url"
|
:reorderChecklistItemUrl="this.element.attributes.orderable.urls.reorder_url"
|
||||||
:inRepository="inRepository"
|
:inRepository="inRepository"
|
||||||
:draggable="checklistItems.length > 1"
|
:draggable="checklistItems.length > 1"
|
||||||
|
:data-e2e="`${dataE2e}-checklistItem${element.id}`"
|
||||||
@editStart="editingItem = true"
|
@editStart="editingItem = true"
|
||||||
@editEnd="editingItem = false"
|
@editEnd="editingItem = false"
|
||||||
@update="saveItem"
|
@update="saveItem"
|
||||||
|
@ -63,6 +67,7 @@
|
||||||
<div v-if="element.attributes.orderable.urls.create_item_url && !addingNewItem"
|
<div v-if="element.attributes.orderable.urls.create_item_url && !addingNewItem"
|
||||||
class="flex items-center gap-1 text-sn-blue cursor-pointer mb-2 mt-1 "
|
class="flex items-center gap-1 text-sn-blue cursor-pointer mb-2 mt-1 "
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
|
:data-e2e="`e2e-BT-${dataE2e}-checklist${element.id}-addNew`"
|
||||||
@keyup.enter="addItem(checklistItems[checklistItems.length - 1]?.id)"
|
@keyup.enter="addItem(checklistItems[checklistItems.length - 1]?.id)"
|
||||||
@click="addItem(checklistItems[checklistItems.length - 1]?.id)">
|
@click="addItem(checklistItems[checklistItems.length - 1]?.id)">
|
||||||
<i class="sn-icon sn-icon-new-task w-6 text-center inline-block"></i>
|
<i class="sn-icon sn-icon-new-task w-6 text-center inline-block"></i>
|
||||||
|
@ -120,6 +125,10 @@ export default {
|
||||||
assignableMyModuleId: {
|
assignableMyModuleId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -154,25 +163,29 @@ export default {
|
||||||
if (this.element.attributes.orderable.urls.update_url) {
|
if (this.element.attributes.orderable.urls.update_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.edit'),
|
text: I18n.t('general.edit'),
|
||||||
emit: 'edit'
|
emit: 'edit',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-checklist${this.element.id}-options-edit`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.duplicate_url) {
|
if (this.element.attributes.orderable.urls.duplicate_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.duplicate'),
|
text: I18n.t('general.duplicate'),
|
||||||
emit: 'duplicate'
|
emit: 'duplicate',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-checklist${this.element.id}-options-duplicate`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.move_targets_url) {
|
if (this.element.attributes.orderable.urls.move_targets_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.move'),
|
text: I18n.t('general.move'),
|
||||||
emit: 'move'
|
emit: 'move',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-checklist${this.element.id}-options-move`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.delete_url) {
|
if (this.element.attributes.orderable.urls.delete_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.delete'),
|
text: I18n.t('general.delete'),
|
||||||
emit: 'delete'
|
emit: 'delete',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-checklist${this.element.id}-options-delete`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="content__checklist-item pl-10 ml-[-2.325rem] group/checklist-item-header">
|
<div class="content__checklist-item pl-10 ml-[-2.325rem] group/checklist-item-header" :data-e2e="`e2e-CO-${dataE2e}`">
|
||||||
<div class="checklist-item-header flex rounded items-center relative w-full" :class="{ 'locked': locked || editingText, 'editing-name': editingText }">
|
<div class="checklist-item-header flex rounded items-center relative w-full" :class="{ 'locked': locked || editingText, 'editing-name': editingText }">
|
||||||
<div v-if="reorderChecklistItemUrl"
|
<div v-if="reorderChecklistItemUrl"
|
||||||
class="absolute h-6 cursor-grab justify-center left-[-2.325rem] top-0.5 px-2 tw-hidden text-sn-grey element-grip step-element-grip--draggable"
|
class="absolute h-6 cursor-grab justify-center left-[-2.325rem] top-0.5 px-2 tw-hidden text-sn-grey element-grip step-element-grip--draggable"
|
||||||
|
@ -14,7 +14,9 @@
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="sci-checkbox"
|
class="sci-checkbox"
|
||||||
:disabled="checklistItem.attributes.isNew"
|
:disabled="checklistItem.attributes.isNew"
|
||||||
:checked="checklistItem.attributes.checked" @change="toggleChecked($event)" />
|
:checked="checklistItem.attributes.checked"
|
||||||
|
:data-e2e="`e2e-CB-${dataE2e}-toggleChecked`"
|
||||||
|
@change="toggleChecked($event)" />
|
||||||
<span class="sci-checkbox-label" >
|
<span class="sci-checkbox-label" >
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
:editOnload="checklistItem.attributes.isNew"
|
:editOnload="checklistItem.attributes.isNew"
|
||||||
:smartAnnotation="true"
|
:smartAnnotation="true"
|
||||||
:allowNewLine="true"
|
:allowNewLine="true"
|
||||||
|
:dataE2e="dataE2e"
|
||||||
@editingEnabled="enableTextEdit"
|
@editingEnabled="enableTextEdit"
|
||||||
@editingDisabled="disableTextEdit"
|
@editingDisabled="disableTextEdit"
|
||||||
@update="updateText"
|
@update="updateText"
|
||||||
|
@ -46,6 +49,7 @@
|
||||||
/>
|
/>
|
||||||
<span v-if="!editingText && (!checklistItem.attributes.urls || deleteUrl)"
|
<span v-if="!editingText && (!checklistItem.attributes.urls || deleteUrl)"
|
||||||
class="absolute right-0 top-0.5 leading-6 tw-hidden group-hover/checklist-item-header:inline-block !text-sn-blue cursor-pointer"
|
class="absolute right-0 top-0.5 leading-6 tw-hidden group-hover/checklist-item-header:inline-block !text-sn-blue cursor-pointer"
|
||||||
|
:data-e2e="`e2e-BT-${dataE2e}-delete`"
|
||||||
@click="showDeleteModal" tabindex="0">
|
@click="showDeleteModal" tabindex="0">
|
||||||
<i class="sn-icon sn-icon-delete"></i>
|
<i class="sn-icon sn-icon-delete"></i>
|
||||||
</span>
|
</span>
|
||||||
|
@ -88,6 +92,10 @@ export default {
|
||||||
reordering: {
|
reordering: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="content__table-container pr-8">
|
<div class="content__table-container pr-8"
|
||||||
|
:data-e2e="`e2e-CO-${dataE2e}-${element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${element.id}`">
|
||||||
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
||||||
<div class="table-header h-9 flex rounded mb-3 items-center relative w-full group/table-header" :class="{ 'editing-name': editingName, 'locked': locked }">
|
<div class="table-header h-9 flex rounded mb-3 items-center relative w-full group/table-header" :class="{ 'editing-name': editingName, 'locked': locked }">
|
||||||
<div v-if="!locked || element.attributes.orderable.name" :key="reloadHeader"
|
<div v-if="!locked || element.attributes.orderable.name" :key="reloadHeader"
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
:allowBlank="false"
|
:allowBlank="false"
|
||||||
:autofocus="editingName"
|
:autofocus="editingName"
|
||||||
:attributeName="`${i18n.t('Table')} ${i18n.t('name')}`"
|
:attributeName="`${i18n.t('Table')} ${i18n.t('name')}`"
|
||||||
|
:dataE2e="`${dataE2e}-${element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${element.id}`"
|
||||||
@editingEnabled="enableNameEdit"
|
@editingEnabled="enableNameEdit"
|
||||||
@editingDisabled="disableNameEdit"
|
@editingDisabled="disableNameEdit"
|
||||||
@update="updateName"
|
@update="updateName"
|
||||||
|
@ -23,6 +25,7 @@
|
||||||
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:btnIcon="'sn-icon sn-icon-more-hori'"
|
:btnIcon="'sn-icon sn-icon-more-hori'"
|
||||||
|
:dataE2e="`e2e-DD-${dataE2e}-${element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${element.id}-options`"
|
||||||
@edit="enableNameEdit"
|
@edit="enableNameEdit"
|
||||||
@duplicate="duplicateElement"
|
@duplicate="duplicateElement"
|
||||||
@move="showMoveModal"
|
@move="showMoveModal"
|
||||||
|
@ -32,11 +35,14 @@
|
||||||
<div class="table-body group/table-body relative border-solid border-transparent"
|
<div class="table-body group/table-body relative border-solid border-transparent"
|
||||||
:class="{'edit border-sn-light-grey': editingTable, 'view': !editingTable, 'locked': !element.attributes.orderable.urls.update_url}"
|
:class="{'edit border-sn-light-grey': editingTable, 'view': !editingTable, 'locked': !element.attributes.orderable.urls.update_url}"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
|
:data_e2e="`e2e-TB-${dataE2e}-${element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${element.id}`"
|
||||||
@keyup.enter="!editingTable && enableTableEdit()">
|
@keyup.enter="!editingTable && enableTableEdit()">
|
||||||
<div ref="hotTable" class="hot-table-container" @click="!editingTable && enableTableEdit()">
|
<div ref="hotTable" class="hot-table-container" @click="!editingTable && enableTableEdit()">
|
||||||
</div>
|
</div>
|
||||||
<div class="text-xs pt-3 pb-2 text-sn-grey h-1">
|
<div class="text-xs pt-3 pb-2 text-sn-grey h-1">
|
||||||
<span v-if="editingTable">{{ i18n.t('protocols.steps.table.edit_message') }}</span>
|
<span v-if="editingTable" :dataE2e="`e2e-TX-${dataE2e}-${element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${element.id}-editMessage`">
|
||||||
|
{{ i18n.t('protocols.steps.table.edit_message') }}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<deleteElementModal v-if="confirmingDelete" @confirm="deleteElement" @cancel="closeDeleteModal"/>
|
<deleteElementModal v-if="confirmingDelete" @confirm="deleteElement" @cancel="closeDeleteModal"/>
|
||||||
|
@ -82,6 +88,10 @@ export default {
|
||||||
assignableMyModuleId: {
|
assignableMyModuleId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -104,25 +114,29 @@ export default {
|
||||||
if (this.element.attributes.orderable.urls.update_url) {
|
if (this.element.attributes.orderable.urls.update_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.edit'),
|
text: I18n.t('general.edit'),
|
||||||
emit: 'edit'
|
emit: 'edit',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-${this.element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${this.element.id}-options-edit`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.duplicate_url) {
|
if (this.element.attributes.orderable.urls.duplicate_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.duplicate'),
|
text: I18n.t('general.duplicate'),
|
||||||
emit: 'duplicate'
|
emit: 'duplicate',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-${this.element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${this.element.id}-options-duplicate`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.move_targets_url) {
|
if (this.element.attributes.orderable.urls.move_targets_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.move'),
|
text: I18n.t('general.move'),
|
||||||
emit: 'move'
|
emit: 'move',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-${this.element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${this.element.id}-options-move`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.delete_url) {
|
if (this.element.attributes.orderable.urls.delete_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.delete'),
|
text: I18n.t('general.delete'),
|
||||||
emit: 'delete'
|
emit: 'delete',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-${this.element.attributes.orderable.metadata.plateTemplate ? 'wellPlate' : 'table'}${this.element.id}-options-delete`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="content__text-container pr-8">
|
<div class="content__text-container pr-8" :data-e2e="`e2e-CO-${dataE2e}-stepText${element.id}`">
|
||||||
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
<div class="sci-divider my-6" v-if="!inRepository"></div>
|
||||||
<div class="text-header h-9 flex rounded mb-1 items-center relative w-full group/text-header" :class="{ 'editing-name': editingName, 'locked': !element.attributes.orderable.urls.update_url }">
|
<div class="text-header h-9 flex rounded mb-1 items-center relative w-full group/text-header"
|
||||||
|
:class="{ 'editing-name': editingName,
|
||||||
|
'locked': !element.attributes.orderable.urls.update_url }">
|
||||||
<div v-if="element.attributes.orderable.urls.update_url || element.attributes.orderable.name"
|
<div v-if="element.attributes.orderable.urls.update_url || element.attributes.orderable.name"
|
||||||
class="grow-1 text-ellipsis whitespace-nowrap grow my-1 font-bold"
|
class="grow-1 text-ellipsis whitespace-nowrap grow my-1 font-bold"
|
||||||
:class="{'pointer-events-none': !element.attributes.orderable.urls.update_url}"
|
:class="{'pointer-events-none': !element.attributes.orderable.urls.update_url}"
|
||||||
|
@ -13,6 +15,7 @@
|
||||||
:allowBlank="true"
|
:allowBlank="true"
|
||||||
:autofocus="editingName"
|
:autofocus="editingName"
|
||||||
:attributeName="`${i18n.t('Text')} ${i18n.t('name')}`"
|
:attributeName="`${i18n.t('Text')} ${i18n.t('name')}`"
|
||||||
|
:dataE2e="`${dataE2e}-stepText${element.id}`"
|
||||||
@editingEnabled="enableNameEdit"
|
@editingEnabled="enableNameEdit"
|
||||||
@editingDisabled="disableNameEdit"
|
@editingDisabled="disableNameEdit"
|
||||||
@update="updateName"
|
@update="updateName"
|
||||||
|
@ -24,13 +27,18 @@
|
||||||
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
:btnClasses="'btn btn-light icon-btn btn-sm'"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
:btnIcon="'sn-icon sn-icon-more-hori'"
|
:btnIcon="'sn-icon sn-icon-more-hori'"
|
||||||
|
:dataE2e="`e2e-DD-${dataE2e}-stepText${element.id}-options`"
|
||||||
@edit="enableNameEdit"
|
@edit="enableNameEdit"
|
||||||
@duplicate="duplicateElement"
|
@duplicate="duplicateElement"
|
||||||
@move="showMoveModal"
|
@move="showMoveModal"
|
||||||
@delete="showDeleteModal"
|
@delete="showDeleteModal"
|
||||||
></MenuDropdown>
|
></MenuDropdown>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex rounded min-h-[2.25rem] mb-4 relative group/text_container content__text-body" :class="{ 'edit': inEditMode, 'component__element--locked': !element.attributes.orderable.urls.update_url }" @keyup.enter="enableEditMode($event)" tabindex="0">
|
<div class="flex rounded min-h-[2.25rem] mb-4 relative group/text_container content__text-body"
|
||||||
|
:class="{ 'edit': inEditMode, 'component__element--locked': !element.attributes.orderable.urls.update_url }"
|
||||||
|
:data-e2e="`e2e-IF-${dataE2e}-stepText${element.id}`"
|
||||||
|
@keyup.enter="enableEditMode($event)"
|
||||||
|
tabindex="0">
|
||||||
<Tinymce
|
<Tinymce
|
||||||
v-if="element.attributes.orderable.urls.update_url"
|
v-if="element.attributes.orderable.urls.update_url"
|
||||||
:value="element.attributes.orderable.text"
|
:value="element.attributes.orderable.text"
|
||||||
|
@ -48,8 +56,8 @@
|
||||||
@editingDisabled="disableEditMode"
|
@editingDisabled="disableEditMode"
|
||||||
@editingEnabled="enableEditMode"
|
@editingEnabled="enableEditMode"
|
||||||
/>
|
/>
|
||||||
<div class="view-text-element" v-else-if="element.attributes.orderable.text_view" v-html="wrappedTables"></div>
|
<div class="view-text-element" v-else-if="element.attributes.orderable.text_view" v-html="wrappedTables" :data-e2e="`e2e-TX-${dataE2e}-stepText${element.id}`"></div>
|
||||||
<div v-else class="text-sn-grey">
|
<div v-else class="text-sn-grey" :data-e2e="`e2e-TX-${dataE2e}-stepText${element.id}-empty`">
|
||||||
{{ i18n.t("protocols.steps.text.empty_text") }}
|
{{ i18n.t("protocols.steps.text.empty_text") }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -96,6 +104,10 @@ export default {
|
||||||
assignableMyModuleId: {
|
assignableMyModuleId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -126,25 +138,29 @@ export default {
|
||||||
if (this.element.attributes.orderable.urls.update_url) {
|
if (this.element.attributes.orderable.urls.update_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.edit'),
|
text: I18n.t('general.edit'),
|
||||||
emit: 'edit'
|
emit: 'edit',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-stepText${this.element.id}-options-edit`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.duplicate_url) {
|
if (this.element.attributes.orderable.urls.duplicate_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.duplicate'),
|
text: I18n.t('general.duplicate'),
|
||||||
emit: 'duplicate'
|
emit: 'duplicate',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-stepText${this.element.id}-options-duplicate`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.move_targets_url) {
|
if (this.element.attributes.orderable.urls.move_targets_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.move'),
|
text: I18n.t('general.move'),
|
||||||
emit: 'move'
|
emit: 'move',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-stepText${this.element.id}-options-move`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.element.attributes.orderable.urls.delete_url) {
|
if (this.element.attributes.orderable.urls.delete_url) {
|
||||||
menu.push({
|
menu.push({
|
||||||
text: I18n.t('general.delete'),
|
text: I18n.t('general.delete'),
|
||||||
emit: 'delete'
|
emit: 'delete',
|
||||||
|
data_e2e: `e2e-BT-${this.dataE2e}-stepText${this.element.id}-options-delete`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return menu;
|
return menu;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="pages.length > 1" class="flex gap-3 select-none">
|
<div v-if="pages.length > 1" class="flex gap-3 select-none">
|
||||||
<div class="w-9 h-9">
|
<div class="w-9 h-9">
|
||||||
<div class="w-9 h-9 cursor-pointer flex items-center justify-center"
|
<div class="w-9 h-9 cursor-pointer flex items-center justify-center" data-e2e="e2e-BT-tableInfo-left"
|
||||||
@click="$emit('setPage', currentPage - 1)"
|
@click="$emit('setPage', currentPage - 1)"
|
||||||
v-if="currentPage > 1">
|
v-if="currentPage > 1">
|
||||||
<i class="sn-icon sn-icon-left cursor-pointer"></i>
|
<i class="sn-icon sn-icon-left cursor-pointer"></i>
|
||||||
|
@ -11,11 +11,12 @@
|
||||||
v-for="page in pages"
|
v-for="page in pages"
|
||||||
:class="{ 'border-solid rounded border-sn-science-blue': page === currentPage }"
|
:class="{ 'border-solid rounded border-sn-science-blue': page === currentPage }"
|
||||||
:key="page"
|
:key="page"
|
||||||
|
:data-e2e="`e2e-BT-tableInfo-page-${page}`"
|
||||||
@click="$emit('setPage', page)">
|
@click="$emit('setPage', page)">
|
||||||
<span >{{ page }}</span>
|
<span >{{ page }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-9 h-9">
|
<div class="w-9 h-9">
|
||||||
<div class="w-9 h-9 cursor-pointer flex items-center justify-center"
|
<div class="w-9 h-9 cursor-pointer flex items-center justify-center" data-e2e="e2e-BT-tableInfo-right"
|
||||||
@click="$emit('setPage', currentPage + 1)"
|
@click="$emit('setPage', currentPage + 1)"
|
||||||
v-if="totalPage > currentPage">
|
v-if="totalPage > currentPage">
|
||||||
<i class="sn-icon sn-icon-right cursor-pointer"></i>
|
<i class="sn-icon sn-icon-right cursor-pointer"></i>
|
||||||
|
@ -30,12 +31,12 @@ export default {
|
||||||
props: {
|
props: {
|
||||||
totalPage: {
|
totalPage: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true,
|
required: true
|
||||||
},
|
},
|
||||||
currentPage: {
|
currentPage: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true,
|
required: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
pages() {
|
pages() {
|
||||||
|
@ -50,7 +51,7 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pages;
|
return pages;
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -75,17 +75,18 @@
|
||||||
:params="actionsParams"
|
:params="actionsParams"
|
||||||
@toolbar:action="emitAction" />
|
@toolbar:action="emitAction" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="scrollMode == 'pages'" class="flex items-center py-4" :class="{'opacity-0': initializing }">
|
<div v-if="scrollMode == 'pages'" class="flex items-center py-4" :class="{'opacity-0': initializing }" data-e2e="e2e-CO-tableInfo">
|
||||||
<div class="flex items-center gap-4">
|
<div class="flex items-center gap-4" data-e2e="e2e-TX-tableInfo-show">
|
||||||
{{ i18n.t('datatable.show') }}
|
{{ i18n.t('datatable.show') }}
|
||||||
<div class="w-36">
|
<div class="w-36">
|
||||||
<SelectDropdown
|
<SelectDropdown
|
||||||
:value="perPage"
|
:value="perPage"
|
||||||
:options="perPageOptions"
|
:options="perPageOptions"
|
||||||
|
:data-e2e="'e2e-DD-tableInfo-rows'"
|
||||||
@change="setPerPage"
|
@change="setPerPage"
|
||||||
></SelectDropdown>
|
></SelectDropdown>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="!dataLoading">
|
<div v-show="!dataLoading" data-e2e="e2e-TX-tableInfo-entries">
|
||||||
<span v-if="selectedRows.length">
|
<span v-if="selectedRows.length">
|
||||||
{{ i18n.t('datatable.entries.selected', { count: totalEntries, selected: selectedRows.length }) }}
|
{{ i18n.t('datatable.entries.selected', { count: totalEntries, selected: selectedRows.length }) }}
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
:btnIcon="action.icon"
|
:btnIcon="action.icon"
|
||||||
:caret="true"
|
:caret="true"
|
||||||
:position="'right'"
|
:position="'right'"
|
||||||
|
:data-e2e="`e2e-BT-topToolbar-${action.name}`"
|
||||||
@dtEvent="handleEvent"
|
@dtEvent="handleEvent"
|
||||||
></MenuDropdown>
|
></MenuDropdown>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
'border-b-sn-science-blue': !error,
|
'border-b-sn-science-blue': !error,
|
||||||
}"
|
}"
|
||||||
v-model="newValue"
|
v-model="newValue"
|
||||||
|
:data-e2e="`e2e-IF-${dataE2e}`"
|
||||||
@keydown="handleKeypress"
|
@keydown="handleKeypress"
|
||||||
@blur="handleBlur"
|
@blur="handleBlur"
|
||||||
@keyup.escape="cancelEdit && this.atWhoOpened"
|
@keyup.escape="cancelEdit && this.atWhoOpened"
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
}"
|
}"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
v-model="newValue"
|
v-model="newValue"
|
||||||
|
:data-e2e="`e2e-IF-${dataE2e}`"
|
||||||
@keydown="handleKeypress"
|
@keydown="handleKeypress"
|
||||||
@blur="handleBlur"
|
@blur="handleBlur"
|
||||||
@keyup.escape="cancelEdit && this.atWhoOpened"
|
@keyup.escape="cancelEdit && this.atWhoOpened"
|
||||||
|
@ -38,6 +40,7 @@
|
||||||
ref="view"
|
ref="view"
|
||||||
class="grid sci-cursor-edit leading-5 border-0 outline-none border-solid border-y border-transparent"
|
class="grid sci-cursor-edit leading-5 border-0 outline-none border-solid border-y border-transparent"
|
||||||
:class="{ 'text-sn-grey font-normal': isBlank, 'whitespace-pre-line py-1': !singleLine }"
|
:class="{ 'text-sn-grey font-normal': isBlank, 'whitespace-pre-line py-1': !singleLine }"
|
||||||
|
:data-e2e="`e2e-TX-${dataE2e}`"
|
||||||
@click="enableEdit($event)"
|
@click="enableEdit($event)"
|
||||||
>
|
>
|
||||||
<span :class="{'truncate': singleLine }" :title="sa_value || placeholder" v-if="smartAnnotation" v-html="sa_value || placeholder" ></span>
|
<span :class="{'truncate': singleLine }" :title="sa_value || placeholder" v-if="smartAnnotation" v-html="sa_value || placeholder" ></span>
|
||||||
|
@ -48,6 +51,7 @@
|
||||||
class="mt-2 whitespace-nowrap truncate text-xs font-normal absolute bottom-[-1rem] w-full"
|
class="mt-2 whitespace-nowrap truncate text-xs font-normal absolute bottom-[-1rem] w-full"
|
||||||
:title="editing && error ? error : timestamp"
|
:title="editing && error ? error : timestamp"
|
||||||
:class="{'text-sn-delete-red': editing && error}"
|
:class="{'text-sn-delete-red': editing && error}"
|
||||||
|
:data-e2e="`e2e-TX-${dataE2e}-timestampError`"
|
||||||
>
|
>
|
||||||
{{ editing && error ? error : timestamp }}
|
{{ editing && error ? error : timestamp }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -76,7 +80,8 @@ export default {
|
||||||
editOnload: { type: Boolean, default: false },
|
editOnload: { type: Boolean, default: false },
|
||||||
defaultValue: { type: String, default: '' },
|
defaultValue: { type: String, default: '' },
|
||||||
singleLine: { type: Boolean, default: true },
|
singleLine: { type: Boolean, default: true },
|
||||||
preventLeavingUntilFilled: { type: Boolean, default: false }
|
preventLeavingUntilFilled: { type: Boolean, default: false },
|
||||||
|
dataE2e: { type: String, default: '' }
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="dropdown-selector">
|
<div class="dropdown-selector" :data-e2e="`e2e-IF-${dataE2e}`">
|
||||||
<select :id="this.selectorId"
|
<select :id="this.selectorId"
|
||||||
:data-select-by-group="groupSelector"
|
:data-select-by-group="groupSelector"
|
||||||
:data-combine-tags="dataCombineTags"
|
:data-combine-tags="dataCombineTags"
|
||||||
|
@ -111,6 +111,10 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
dataE2e: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
onChange: Function
|
onChange: Function
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -127,6 +131,7 @@ export default {
|
||||||
tagLabel: this.tagLabel,
|
tagLabel: this.tagLabel,
|
||||||
labelHTML: this.labelHTML,
|
labelHTML: this.labelHTML,
|
||||||
onOpen: this.onOpen,
|
onOpen: this.onOpen,
|
||||||
|
dataE2e: this.dataE2e,
|
||||||
onChange: () => {
|
onChange: () => {
|
||||||
if (this.onChange) this.onChange();
|
if (this.onChange) this.onChange();
|
||||||
this.selectChanged(dropdownSelector.getValues(`#${this.selectorId}`));
|
this.selectChanged(dropdownSelector.getValues(`#${this.selectorId}`));
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="relative" v-if="listItems.length > 0 || alwaysShow" v-click-outside="closeMenu" >
|
<div class="relative" v-if="listItems.length > 0 || alwaysShow" v-click-outside="closeMenu" >
|
||||||
<button ref="field" :class="btnClasses" :title="title" @click="isOpen = !isOpen" :data-e2e="e2eSortButton">
|
<button ref="field" :class="btnClasses" :title="title" @click="isOpen = !isOpen" :data-e2e="dataE2e">
|
||||||
<i v-if="btnIcon" :class="btnIcon"></i>
|
<i v-if="btnIcon" :class="btnIcon"></i>
|
||||||
{{ btnText }}
|
{{ btnText }}
|
||||||
<i v-if="caret && isOpen" class="sn-icon sn-icon-up"></i>
|
<i v-if="caret && isOpen" class="sn-icon sn-icon-up"></i>
|
||||||
|
@ -35,6 +35,7 @@
|
||||||
:class="{ 'bg-sn-super-light-blue': item.active }"
|
:class="{ 'bg-sn-super-light-blue': item.active }"
|
||||||
class="flex group items-center rounded relative text-sn-blue whitespace-nowrap px-3 py-2.5 hover:no-underline cursor-pointer
|
class="flex group items-center rounded relative text-sn-blue whitespace-nowrap px-3 py-2.5 hover:no-underline cursor-pointer
|
||||||
group-hover:bg-sn-super-light-blue hover:!bg-sn-super-light-grey"
|
group-hover:bg-sn-super-light-blue hover:!bg-sn-super-light-grey"
|
||||||
|
:data-e2e="item.data_e2e"
|
||||||
>
|
>
|
||||||
{{ item.text }}
|
{{ item.text }}
|
||||||
<i class="sn-icon sn-icon-right ml-auto"></i>
|
<i class="sn-icon sn-icon-right ml-auto"></i>
|
||||||
|
@ -50,6 +51,7 @@
|
||||||
:href="sub_item.url"
|
:href="sub_item.url"
|
||||||
:traget="sub_item.url_target || '_self'"
|
:traget="sub_item.url_target || '_self'"
|
||||||
:class="{ 'bg-sn-super-light-blue': item.active }"
|
:class="{ 'bg-sn-super-light-blue': item.active }"
|
||||||
|
:data-e2e="`${sub_item.data_e2e}`"
|
||||||
class="block whitespace-nowrap rounded px-3 py-2.5 hover:!text-sn-blue hover:no-underline cursor-pointer hover:bg-sn-super-light-grey leading-5"
|
class="block whitespace-nowrap rounded px-3 py-2.5 hover:!text-sn-blue hover:no-underline cursor-pointer hover:bg-sn-super-light-grey leading-5"
|
||||||
@click="handleClick($event, sub_item)"
|
@click="handleClick($event, sub_item)"
|
||||||
>
|
>
|
||||||
|
@ -80,7 +82,7 @@ export default {
|
||||||
caret: { type: Boolean, default: false },
|
caret: { type: Boolean, default: false },
|
||||||
alwaysShow: { type: Boolean, default: false },
|
alwaysShow: { type: Boolean, default: false },
|
||||||
title: { type: String, default: '' },
|
title: { type: String, default: '' },
|
||||||
e2eSortButton: { type: String, default: '' }
|
dataE2e: { type: String, default: '' }
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -56,7 +56,6 @@ class MyModule < ApplicationRecord
|
||||||
belongs_to :changing_from_my_module_status, optional: true, class_name: 'MyModuleStatus'
|
belongs_to :changing_from_my_module_status, optional: true, class_name: 'MyModuleStatus'
|
||||||
delegate :my_module_status_flow, to: :my_module_status, allow_nil: true
|
delegate :my_module_status_flow, to: :my_module_status, allow_nil: true
|
||||||
has_many :results, inverse_of: :my_module, dependent: :destroy
|
has_many :results, inverse_of: :my_module, dependent: :destroy
|
||||||
has_many :results_include_discarded, -> { with_discarded }, class_name: 'Result', inverse_of: :my_module
|
|
||||||
has_many :my_module_tags, inverse_of: :my_module, dependent: :destroy
|
has_many :my_module_tags, inverse_of: :my_module, dependent: :destroy
|
||||||
has_many :tags, through: :my_module_tags, dependent: :destroy
|
has_many :tags, through: :my_module_tags, dependent: :destroy
|
||||||
has_many :task_comments, foreign_key: :associated_id, dependent: :destroy
|
has_many :task_comments, foreign_key: :associated_id, dependent: :destroy
|
||||||
|
|
|
@ -5,9 +5,6 @@ class Result < ApplicationRecord
|
||||||
include SearchableModel
|
include SearchableModel
|
||||||
include SearchableByNameModel
|
include SearchableByNameModel
|
||||||
include ViewableModel
|
include ViewableModel
|
||||||
include Discard::Model
|
|
||||||
|
|
||||||
default_scope -> { kept }
|
|
||||||
|
|
||||||
auto_strip_attributes :name, nullify: false
|
auto_strip_attributes :name, nullify: false
|
||||||
validates :name, length: { maximum: Constants::NAME_MAX_LENGTH }
|
validates :name, length: { maximum: Constants::NAME_MAX_LENGTH }
|
||||||
|
|
|
@ -19,6 +19,7 @@ module Lists
|
||||||
status
|
status
|
||||||
designated_users
|
designated_users
|
||||||
tags
|
tags
|
||||||
|
tags_html
|
||||||
comments
|
comments
|
||||||
due_date_formatted
|
due_date_formatted
|
||||||
permissions
|
permissions
|
||||||
|
@ -142,6 +143,17 @@ module Lists
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def tags_html
|
||||||
|
# legacy canvas support
|
||||||
|
return '' unless @instance_options[:controller]
|
||||||
|
|
||||||
|
@instance_options[:controller].render_to_string(
|
||||||
|
partial: 'canvas/tags',
|
||||||
|
locals: { my_module: object },
|
||||||
|
formats: :html
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def comments
|
def comments
|
||||||
@user = scope[:user] || @instance_options[:user]
|
@user = scope[:user] || @instance_options[:user]
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,20 +55,9 @@ class ActivitiesService
|
||||||
child_model = parent_model.reflect_on_association(child).class_name.to_sym
|
child_model = parent_model.reflect_on_association(child).class_name.to_sym
|
||||||
next if subjects[child_model]
|
next if subjects[child_model]
|
||||||
|
|
||||||
|
subjects[child_model] = parent_model.where(id: subjects[subject_name])
|
||||||
if subject_name == 'Result'
|
.joins(child)
|
||||||
parent_model = parent_model.with_discarded
|
.pluck("#{child.to_s.pluralize}.id")
|
||||||
end
|
|
||||||
|
|
||||||
if child == :results
|
|
||||||
subjects[child_model] = parent_model.where(id: subjects[subject_name])
|
|
||||||
.joins(:results_include_discarded)
|
|
||||||
.pluck('results.id')
|
|
||||||
else
|
|
||||||
subjects[child_model] = parent_model.where(id: subjects[subject_name])
|
|
||||||
.joins(child)
|
|
||||||
.pluck("#{child.to_s.pluralize}.id")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,7 @@
|
||||||
data-protocol-url="<%= protocol_my_module_path(@my_module) %>"
|
data-protocol-url="<%= protocol_my_module_path(@my_module) %>"
|
||||||
data-date-format="<%= datetime_picker_format_date_only %>"
|
data-date-format="<%= datetime_picker_format_date_only %>"
|
||||||
data-user-utc-offset="<%= ActiveSupport::TimeZone.find_tzinfo(current_user.time_zone).utc_offset %>"
|
data-user-utc-offset="<%= ActiveSupport::TimeZone.find_tzinfo(current_user.time_zone).utc_offset %>"
|
||||||
|
data-e2e="e2e-CO-task-protocol"
|
||||||
>
|
>
|
||||||
<protocol-container
|
<protocol-container
|
||||||
:protocol-url="protocolUrl"
|
:protocol-url="protocolUrl"
|
||||||
|
|
|
@ -1,29 +1,45 @@
|
||||||
<%= form_for :protocol, url: team_import_external_protocol_path(team_id: current_team.id),
|
<%= form_for :protocol, url: team_import_external_protocol_path(team_id: current_team.id),
|
||||||
method: :post, data: { remote: true } do |f|%>
|
method: :post, data: { remote: true } do |f|%>
|
||||||
<div class="general-error has-error">
|
<div class="general-error has-error" data-e2e="e2e-TX-protocolTemplates-previewProtocolsIo-error">
|
||||||
<span class="has-error help-block"></span>
|
<span class="has-error help-block"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group sci-input-container">
|
<div class="form-group sci-input-container">
|
||||||
<%= f.label :name, t('protocols.import_export.import_modal.name_label') %>
|
<%= f.label :name,
|
||||||
<%= f.text_field :name, class: 'form-control sci-input-field', value: protocol.name %>
|
t('protocols.import_export.import_modal.name_label'),
|
||||||
|
:"data-e2e" => "e2e-TX-protocolTemplates-previewProtocolsIo-nameInput" %>
|
||||||
|
<%= f.text_field :name,
|
||||||
|
class: 'form-control sci-input-field',
|
||||||
|
value: protocol.name,
|
||||||
|
:"data-e2e" => "e2e-IF-protocolTemplates-previewProtocolsIo-nameInput" %>
|
||||||
<span class="help-block"></span>
|
<span class="help-block"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group sci-input-container">
|
<div class="form-group sci-input-container">
|
||||||
<%= f.label :authors, t('protocols.import_export.import_modal.authors_label') %>
|
<%= f.label :authors,
|
||||||
<%= f.text_field :authors, class: 'form-control sci-input-field', value: protocol.authors %>
|
t('protocols.import_export.import_modal.authors_label'),
|
||||||
|
:"data-e2e" => "e2e-TX-protocolTemplates-previewProtocolsIo-authorsInput" %>
|
||||||
|
<%= f.text_field :authors,
|
||||||
|
class: 'form-control sci-input-field',
|
||||||
|
value: protocol.authors,
|
||||||
|
:"data-e2e" => "e2e-IF-protocolTemplates-previewProtocolsIo-authorsInput" %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="import-protocol-preview-description">
|
<div class="import-protocol-preview-description" data-e2e="e2e-TX-protocolTemplates-previewProtocolsIo-description">
|
||||||
<%= custom_auto_link(protocol.description, simple_format: false, team: current_team) %>
|
<%= custom_auto_link(protocol.description, simple_format: false, team: current_team) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<%= f.label :published_on_label, t('protocols.import_export.import_modal.published_on_label')%>
|
<%= f.label :published_on_label,
|
||||||
<%= f.text_field :published_on_label, value: I18n.l(protocol.published_on, format: :full), class: 'form-control', disabled: true %>
|
t('protocols.import_export.import_modal.published_on_label'),
|
||||||
|
:"data-e2e" => "e2e-TX-protocolTemplates-previewProtocolsIo-publishedOnLabel" %>
|
||||||
|
<%= f.text_field :published_on_label,
|
||||||
|
value: I18n.l(protocol.published_on, format: :full),
|
||||||
|
class: 'form-control',
|
||||||
|
disabled: true,
|
||||||
|
:'data-e2e' => "e2e-TX-protocolTemplates-previewProtocolsIo-publishedOn" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -39,11 +55,11 @@
|
||||||
|
|
||||||
<div data-role="steps-container">
|
<div data-role="steps-container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-8">
|
<div class="col-xs-8" data-e2e="e2e-TX-protocolTemplates-previewProtocolsIo-protocolSteps">
|
||||||
<h2><%= t("protocols.steps.subtitle") %></h2>
|
<h2><%= t("protocols.steps.subtitle") %></h2>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="steps">
|
<div id="steps" data-e2e="e2e-CO-protocolTemplates-previewProtocolsIo-protocolSteps">
|
||||||
<% protocol.steps.sort_by{ |s| s.position }.each do |step| %>
|
<% protocol.steps.sort_by{ |s| s.position }.each do |step| %>
|
||||||
<%= render partial: "steps/step", locals: { step: step, steps_assets: steps_assets, preview: true, import: true } %>
|
<%= render partial: "steps/step", locals: { step: step, steps_assets: steps_assets, preview: true, import: true } %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<div class="left-section">
|
<div class="left-section">
|
||||||
<div class="default-role-container">
|
<div class="default-role-container">
|
||||||
<div class="sci-checkbox-container">
|
<div class="sci-checkbox-container" data-e2e="e2e-CB-protocolTemplates-previewProtocolsIo-grantAccess">
|
||||||
<%= check_box_tag "visibility", "visible", false, class: "sci-checkbox" %>
|
<%= check_box_tag "visibility", "visible", false, class: "sci-checkbox" %>
|
||||||
<span class="sci-checkbox-label"></span>
|
<span class="sci-checkbox-label"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="default-role-description">
|
<div class="default-role-description" data-e2e="e2e-TX-protocolTemplates-previewProtocolsIo-grantAccess">
|
||||||
<%= t("protocols.new_protocol_modal.access_label") %>
|
<%= t("protocols.new_protocol_modal.access_label") %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hidden" id="roleSelectWrapper">
|
<div class="hidden" id="roleSelectWrapper" data-e2e="e2e-DD-protocolTemplates-previewProtocolsIo-userRole">
|
||||||
<div class="sci-input-container">
|
<div class="sci-input-container">
|
||||||
<%= label_tag :default_public_user_role_id, t("protocols.new_protocol_modal.role_label") %>
|
<%= label_tag :default_public_user_role_id, t("protocols.new_protocol_modal.role_label") %>
|
||||||
<% default_role = UserRole.find_by(name: I18n.t('user_roles.predefined.viewer')).id %>
|
<% default_role = UserRole.find_by(name: I18n.t('user_roles.predefined.viewer')).id %>
|
||||||
|
@ -19,7 +19,13 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right-section">
|
<div class="right-section">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal"><%=t "general.cancel" %></button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal"
|
||||||
<button type="button" class="btn btn-primary" data-action="import_protocol" data-import_type="in_repository_draft"><%=t "protocols.import_export.import_modal.import_protocols_label" %></button>
|
data-e2e="e2e-BT-protocolTemplates-previewProtocolsIo-cancel">
|
||||||
|
<%=t "general.cancel" %>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-primary" data-action="import_protocol"
|
||||||
|
data-import_type="in_repository_draft" data-e2e="e2e-BT-protocolTemplates-previewProtocolsIo-import">
|
||||||
|
<%=t "protocols.import_export.import_modal.import_protocols_label" %>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,61 +1,101 @@
|
||||||
<div id="import-protocol-modal" class="modal fade" role="dialog">
|
<div id="import-protocol-modal" class="modal fade" role="dialog" data-e2e="e2e-MD-protocolTemplates-importEln">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
<button type="button" class="close" data-dismiss="modal" data-e2e="e2e-BT-protocolTemplates-importEln-close">
|
||||||
<h4 class="modal-title" data-role="header-import"><%= t("protocols.import_export.import_modal.title_import") %></h4>
|
×
|
||||||
<h4 class="modal-title" data-role="header-import-into-protocol"><%= t("protocols.import_export.import_modal.title_import_into_protocol") %></h4>
|
</button>
|
||||||
|
<h4 class="modal-title" data-role="header-import" data-e2e="e2e-TX-protocolTemplates-importEln-title">
|
||||||
|
<%= t("protocols.import_export.import_modal.title_import") %>
|
||||||
|
</h4>
|
||||||
|
<h4 class="modal-title" data-role="header-import-into-protocol">
|
||||||
|
<%= t("protocols.import_export.import_modal.title_import_into_protocol") %>
|
||||||
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<!-- Warning message -->
|
<!-- Warning message -->
|
||||||
<div data-role="import-message" style="margin-bottom: 15px;">
|
<div data-role="import-message"
|
||||||
|
style="margin-bottom: 15px;"
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importEln-warning">
|
||||||
<b><%= t("protocols.import_export.import_modal.import_into_protocol_message") %></b>
|
<b><%= t("protocols.import_export.import_modal.import_into_protocol_message") %></b>
|
||||||
<br />
|
<br />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- General protocol info -->
|
<!-- General protocol info -->
|
||||||
<div class="form-group sci-input-container">
|
<div class="form-group sci-input-container">
|
||||||
<label for="import_protocol_name"><%= t("protocols.import_export.import_modal.name_label") %></label>
|
<label for="import_protocol_name" data-e2e="e2e-TX-protocolTemplates-importEln-nameInput">
|
||||||
<input type="text" class="form-control sci-input-field" id="import_protocol_name">
|
<%= t("protocols.import_export.import_modal.name_label") %>
|
||||||
|
</label>
|
||||||
|
<input type="text"
|
||||||
|
class="form-control sci-input-field"
|
||||||
|
id="import_protocol_name"
|
||||||
|
data-e2e="e2e-IF-protocolTemplates-importEln-nameInput">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group sci-input-container">
|
<div class="form-group sci-input-container">
|
||||||
<label for="protocol_authors">
|
<label for="protocol_authors" data-e2e="e2e-TX-protocolTemplates-importEln-authorsInput">
|
||||||
<span class="sn-icon sn-icon-user-menu"></span> <%= t("protocols.import_export.import_modal.authors_label") %>
|
<span class="sn-icon sn-icon-user-menu"></span> <%= t("protocols.import_export.import_modal.authors_label") %>
|
||||||
</label>
|
</label>
|
||||||
<input type="text" class="form-control sci-input-field" id="protocol_authors">
|
<input type="text"
|
||||||
|
class="form-control sci-input-field"
|
||||||
|
id="protocol_authors"
|
||||||
|
data-e2e="e2e-IF-protocolTemplates-importEln-authorsInput">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="import_protocol_description"><%= t("protocols.import_export.import_modal.description_label") %></label>
|
<label for="import_protocol_description" data-e2e="e2e-TX-protocolTemplates-importEln-descriptionLabel">
|
||||||
<div id="import_protocol_description" class="overflow-auto" rows="2"></div>
|
<%= t("protocols.import_export.import_modal.description_label") %>
|
||||||
|
</label>
|
||||||
|
<div id="import_protocol_description"
|
||||||
|
class="overflow-auto"
|
||||||
|
rows="2"
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importEln-description">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-4">
|
<div class="col-xs-4">
|
||||||
<label for="protocol_created_at"><%= t("protocols.import_export.import_modal.created_at_label") %></label>
|
<label for="protocol_created_at" data-e2e="e2e-TX-protocolTemplates-importEln-createdAtLabel">
|
||||||
<input type="text" class="form-control" id="protocol_created_at" disabled>
|
<%= t("protocols.import_export.import_modal.created_at_label") %>
|
||||||
|
</label>
|
||||||
|
<input type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="protocol_created_at"
|
||||||
|
disabled
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importEln-createdAt">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-4">
|
<div class="col-xs-4">
|
||||||
<label for="protocol_updated_at"><%= t("protocols.import_export.import_modal.updated_at_label") %></label>
|
<label for="protocol_updated_at" data-e2e="e2e-TX-protocolTemplates-importEln-updatedAtLabel">
|
||||||
<input type="text" class="form-control" id="protocol_updated_at" disabled>
|
<%= t("protocols.import_export.import_modal.updated_at_label") %>
|
||||||
|
</label>
|
||||||
|
<input type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="protocol_updated_at"
|
||||||
|
disabled
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importEln-updatedAt">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Preview title -->
|
<!-- Preview title -->
|
||||||
<div>
|
<div>
|
||||||
<h2 style="display: inline;"><%= t("protocols.import_export.import_modal.preview_title") %></h2>
|
<h2 style="display: inline;" data-e2e="e2e-TX-protocolTemplates-importEln-previewTitle">
|
||||||
|
<%= t("protocols.import_export.import_modal.preview_title") %>
|
||||||
|
</h2>
|
||||||
<h3 style="display: none;" data-role="title-position"></h3>
|
<h3 style="display: none;" data-role="title-position"></h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Preview scroller -->
|
<!-- Preview scroller -->
|
||||||
<div>
|
<div>
|
||||||
<div class="import-protocols-modal-preview-container" data-role="preview-container">
|
<div class="import-protocols-modal-preview-container"
|
||||||
|
data-role="preview-container"
|
||||||
|
data-e2e="e2e-CO-protocolTemplates-importEln-preview">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<div data-role="multiple-protocols-buttons">
|
<div data-role="multiple-protocols-buttons">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal"><%= t("general.cancel") %></button>
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">
|
||||||
|
<%= t("general.cancel") %>
|
||||||
|
</button>
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<a href="#" class="btn btn-secondary" data-action="jump-to-first-protocol"><i class="fas fa-fast-backward"></i></a>
|
<a href="#" class="btn btn-secondary" data-action="jump-to-first-protocol"><i class="fas fa-fast-backward"></i></a>
|
||||||
<a href="#" class="btn btn-secondary" data-action="jump-to-previous-protocol"><i class="fas fa-backward"></i></a>
|
<a href="#" class="btn btn-secondary" data-action="jump-to-previous-protocol"><i class="fas fa-backward"></i></a>
|
||||||
|
@ -64,18 +104,34 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<div data-role="import-all">
|
<div data-role="import-all">
|
||||||
<button type="submit" class="btn btn-success" data-action="import-current"><%= t("protocols.import_export.import_modal.import_current") %></button>
|
<button type="submit" class="btn btn-success" data-action="import-current">
|
||||||
<button type="submit" class="btn btn-success" data-action="import-all"><%= t("protocols.import_export.import_modal.import_all") %></button>
|
<%= t("protocols.import_export.import_modal.import_current") %>
|
||||||
|
</button>
|
||||||
|
<button type="submit" class="btn btn-success" data-action="import-all">
|
||||||
|
<%= t("protocols.import_export.import_modal.import_all") %>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div data-role="import-single">
|
<div data-role="import-single">
|
||||||
<button type="submit" class="btn btn-success" data-action="import-current"><%= t("protocols.import_export.import_modal.import") %></button>
|
<button type="submit" class="btn btn-success" data-action="import-current">
|
||||||
|
<%= t("protocols.import_export.import_modal.import") %>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-role="single-protocol-buttons">
|
<div data-role="single-protocol-buttons">
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal"><%= t("general.cancel") %></button>
|
<button type="button"
|
||||||
|
class="btn btn-secondary"
|
||||||
|
data-dismiss="modal"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-importEln-cancel">
|
||||||
|
<%= t("general.cancel") %>
|
||||||
|
</button>
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<button type="submit" class="btn btn-success" data-action="import-current"><%= t("protocols.import_export.import_modal.import") %></button>
|
<button type="submit"
|
||||||
|
class="btn btn-success"
|
||||||
|
data-action="import-current"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-importEln-load">
|
||||||
|
<%= t("protocols.import_export.import_modal.import") %>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
<div class="content-pane flexible protocols-index <%= @type %>">
|
<div class="content-pane flexible protocols-index <%= @type %>">
|
||||||
<div class="content-header sticky-header">
|
<div class="content-header sticky-header">
|
||||||
<div class="title-row">
|
<div class="title-row" data-e2e="e2e-TX-protocolTemplates-title">
|
||||||
<% if templates_view_mode_archived?(type: @type) %>
|
<% if templates_view_mode_archived?(type: @type) %>
|
||||||
<h1>
|
<h1>
|
||||||
<span><%= t('labels.archived')%></span>
|
<span><%= t('labels.archived')%></span>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="protocols-container">
|
<div class="protocols-container" data-e2e="e2e-CO-protocolTemplates">
|
||||||
<div id="ProtocolsTable" class="fixed-content-body">
|
<div id="ProtocolsTable" class="fixed-content-body">
|
||||||
<protocols-table
|
<protocols-table
|
||||||
ref="table"
|
ref="table"
|
||||||
|
|
|
@ -1,13 +1,21 @@
|
||||||
<div class="modal" id="protocol-preview-modal" tabindex="-1" role="dialog" aria-labelledby="protocol-preview-modal-label">
|
<div class="modal" id="protocol-preview-modal" tabindex="-1" role="dialog" aria-labelledby="protocol-preview-modal-label">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content" data-e2e="e2e-MD-protocolTemplates-previewProtocolsIo">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="sn-icon sn-icon-close"></i></button>
|
<button type="button"
|
||||||
<h4 class="modal-title" id="protocol-preview-modal-label">
|
class="close"
|
||||||
|
data-dismiss="modal"
|
||||||
|
aria-label="Close"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-previewProtocolsIo-close">
|
||||||
|
<i class="sn-icon sn-icon-close"></i>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title"
|
||||||
|
id="protocol-preview-modal-label"
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-previewProtocolsIo-title">
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body"></div>
|
<div class="modal-body" data-e2e="e2e-CO-protocolTemplates-previewProtocolsIo-body"></div>
|
||||||
<div class="modal-footer"></div>
|
<div class="modal-footer" data-e2e="e2e-CO-protocolTemplates-previewProtocolsIo-footer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" id="protocolsioModal" data-url="<%= protocolsio_protocols_path %>" tabindex="-1" role="dialog" aria-labelledby="protocolsio-modal-label">
|
<div class="modal" id="protocolsioModal" data-url="<%= protocolsio_protocols_path %>" tabindex="-1" role="dialog" aria-labelledby="protocolsio-modal-label">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
<div class="modal-content"></div>
|
<div class="modal-content" data-e2e="e2e-MD-protocolTemplates-importProtocolsIo"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<%= javascript_include_tag "protocols/steps" %>
|
<%= javascript_include_tag "protocols/steps" %>
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="sn-icon sn-icon-close"></i></button>
|
<button type="button"
|
||||||
<h4 class="modal-title" id="publish-results-modal-label">
|
class="close"
|
||||||
|
data-dismiss="modal"
|
||||||
|
aria-label="Close"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-importProtocolsIo-close">
|
||||||
|
<i class="sn-icon sn-icon-close"></i>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title" id="publish-results-modal-label" data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-title">
|
||||||
<%= t('protocols.index.protocolsio.title') %>
|
<%= t('protocols.index.protocolsio.title') %>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,6 +26,7 @@
|
||||||
<input class='sci-input-field'
|
<input class='sci-input-field'
|
||||||
type='text'
|
type='text'
|
||||||
name='key'
|
name='key'
|
||||||
|
data-e2e='e2e-IF-protocolTemplates-importProtocolsIo-search'
|
||||||
placeholder="<%= t('protocols.index.protocolsio.search_bar_placeholder') %>" />
|
placeholder="<%= t('protocols.index.protocolsio.search_bar_placeholder') %>" />
|
||||||
<i class='sn-icon sn-icon-search'></i>
|
<i class='sn-icon sn-icon-search'></i>
|
||||||
</div>
|
</div>
|
||||||
|
@ -27,7 +34,13 @@
|
||||||
|
|
||||||
<div class='protocol-sort'>
|
<div class='protocol-sort'>
|
||||||
<div class="dropdown sort-menu" title="<%= t("general.sort.title") %>">
|
<div class="dropdown sort-menu" title="<%= t("general.sort.title") %>">
|
||||||
<button class="btn btn-light btn-black icon-btn" type="button" id="sortMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
<button class="btn btn-light btn-black icon-btn"
|
||||||
|
type="button"
|
||||||
|
id="sortMenu"
|
||||||
|
data-toggle="dropdown"
|
||||||
|
aria-haspopup="true"
|
||||||
|
aria-expanded="true"
|
||||||
|
data-e2e="e2e-DD-protocolTemplates-importProtocolsIo-sort">
|
||||||
<span><i class="sn-icon sn-icon-sort-down"></i></span>
|
<span><i class="sn-icon sn-icon-sort-down"></i></span>
|
||||||
</button>
|
</button>
|
||||||
<ul id="sortMenuDropdown" class="dropdown-menu sort-projects-menu dropdown-menu-right" aria-labelledby="sortMenu">
|
<ul id="sortMenuDropdown" class="dropdown-menu sort-projects-menu dropdown-menu-right" aria-labelledby="sortMenu">
|
||||||
|
@ -43,33 +56,39 @@
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class='protocol-list-side-panel'>
|
<div class='protocol-list-side-panel'>
|
||||||
<div class='row empty-text'>
|
<div class='row empty-text' data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-results-empty">
|
||||||
<%= t('protocols.index.protocolsio.list_panel.empty_text') %>
|
<%= t('protocols.index.protocolsio.list_panel.empty_text') %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='list-wrapper perfect-scrollbar'></div>
|
<div class='list-wrapper perfect-scrollbar' data-e2e="e2e-CO-protocolTemplates-importProtocolsIo-results">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class='protocol-preview-panel'>
|
<div class='protocol-preview-panel'>
|
||||||
<div class='empty-preview-panel'>
|
<div class='empty-preview-panel'>
|
||||||
|
|
||||||
<div class='row'>
|
<div class='row'>
|
||||||
<div class='text-rows protocol-preview-text'>
|
<div class='text-rows protocol-preview-text'
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-previewEmpty-title">
|
||||||
<%= t('protocols.index.protocolsio.preview_panel.empty_title') %>
|
<%= t('protocols.index.protocolsio.preview_panel.empty_title') %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='row'>
|
<div class='row'>
|
||||||
<div class='text-separator'> <hr> </div>
|
<div class='text-separator' data-e2e="e2e-EL-protocolTemplates-importProtocolsIo-previewEmpty-separator">
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='row'>
|
<div class='row'>
|
||||||
<div class='text-rows protocol-preview-subtext'>
|
<div class='text-rows protocol-preview-subtext'
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-previewEmpty-subText">
|
||||||
<%= t('protocols.index.protocolsio.preview_panel.empty_subtext') %>
|
<%= t('protocols.index.protocolsio.preview_panel.empty_subtext') %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class='row-bottom'>
|
<div class='row-bottom'>
|
||||||
<div class='text-rows protocol-preview-subtext'>
|
<div class='text-rows protocol-preview-subtext'
|
||||||
|
data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-previewEmpty-poweredBy">
|
||||||
<%= t('protocols.index.protocolsio.preview_panel.powered_by') %>
|
<%= t('protocols.index.protocolsio.preview_panel.powered_by') %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -77,7 +96,7 @@
|
||||||
|
|
||||||
<div class='full-preview-panel' style='display: none;'>
|
<div class='full-preview-panel' style='display: none;'>
|
||||||
<div class='row preview-banner'>
|
<div class='row preview-banner'>
|
||||||
<div class='col-md-6 txt-holder'>
|
<div class='col-md-6 txt-holder' data-e2e="e2e-TX-protocolTemplates-importProtocolsIo-preview-title">
|
||||||
<span>
|
<span>
|
||||||
<b><%= t('protocols.index.protocolsio.preview_panel.banner_text') %></b>
|
<b><%= t('protocols.index.protocolsio.preview_panel.banner_text') %></b>
|
||||||
</span>
|
</span>
|
||||||
|
@ -85,7 +104,7 @@
|
||||||
<div class='col-md-6 btn-holder'>
|
<div class='col-md-6 btn-holder'>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class='preview-holder perfect-scrollbar'>
|
<div class='preview-holder perfect-scrollbar' data-e2e="e2e-CO-protocolTemplates-importProtocolsIo-preview">
|
||||||
<iframe scrolling="no" class='preview-iframe'></iframe>
|
<iframe scrolling="no" class='preview-iframe'></iframe>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -94,7 +113,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" data-dismiss="modal" class="btn btn-secondary"><%=t('general.cancel') %></button>
|
<button type="button"
|
||||||
<button type="button" class="btn btn-primary convert-protocol" disabled><%= t('protocols.index.protocolsio.convert') %></button>
|
data-dismiss="modal"
|
||||||
|
class="btn btn-secondary"
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-importProtocolsIo-cancel">
|
||||||
|
<%=t('general.cancel') %>
|
||||||
|
</button>
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-primary convert-protocol"
|
||||||
|
disabled
|
||||||
|
data-e2e="e2e-BT-protocolTemplates-importProtocolsIo-convert">
|
||||||
|
<%= t('protocols.index.protocolsio.convert') %>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<div class="content-pane protocols-show flexible with-grey-background pb-4" >
|
<div class="content-pane protocols-show flexible with-grey-background pb-4" >
|
||||||
<div class="content-header sticky-header">
|
<div class="content-header sticky-header">
|
||||||
<div class="title-row">
|
<div class="title-row">
|
||||||
<h1>
|
<h1 data-e2e="e2e-TX-protocolTemplates-protocol-title">
|
||||||
<% if @inline_editable_title_config.present? %>
|
<% if @inline_editable_title_config.present? %>
|
||||||
<%= render partial: "shared/inline_editing",
|
<%= render partial: "shared/inline_editing",
|
||||||
locals: {
|
locals: {
|
||||||
|
@ -33,6 +33,7 @@
|
||||||
data-protocol-url="<%= protocol_path(@protocol) %>"
|
data-protocol-url="<%= protocol_path(@protocol) %>"
|
||||||
data-date-format="<%= datetime_picker_format_date_only %>"
|
data-date-format="<%= datetime_picker_format_date_only %>"
|
||||||
data-user-utc-offset="<%= ActiveSupport::TimeZone.find_tzinfo(current_user.time_zone).utc_offset %>"
|
data-user-utc-offset="<%= ActiveSupport::TimeZone.find_tzinfo(current_user.time_zone).utc_offset %>"
|
||||||
|
data-e2e="e2e-CO-protocolTemplates-protocol"
|
||||||
>
|
>
|
||||||
<protocol-container
|
<protocol-container
|
||||||
:protocol-url="protocolUrl"
|
:protocol-url="protocolUrl"
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
class AddDiscardedAtToResults < ActiveRecord::Migration[7.0]
|
|
||||||
def change
|
|
||||||
add_column :results, :discarded_at, :datetime
|
|
||||||
add_index :results, :discarded_at
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.0].define(version: 2024_04_29_070135) do
|
ActiveRecord::Schema[7.0].define(version: 2024_01_18_094253) do
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "btree_gist"
|
enable_extension "btree_gist"
|
||||||
enable_extension "pg_trgm"
|
enable_extension "pg_trgm"
|
||||||
|
@ -984,12 +984,10 @@ ActiveRecord::Schema[7.0].define(version: 2024_04_29_070135) do
|
||||||
t.bigint "restored_by_id"
|
t.bigint "restored_by_id"
|
||||||
t.datetime "restored_on", precision: nil
|
t.datetime "restored_on", precision: nil
|
||||||
t.integer "assets_view_mode", default: 0
|
t.integer "assets_view_mode", default: 0
|
||||||
t.datetime "discarded_at"
|
|
||||||
t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_results_on_name", using: :gin
|
t.index "trim_html_tags((name)::text) gin_trgm_ops", name: "index_results_on_name", using: :gin
|
||||||
t.index ["archived"], name: "index_results_on_archived"
|
t.index ["archived"], name: "index_results_on_archived"
|
||||||
t.index ["archived_by_id"], name: "index_results_on_archived_by_id"
|
t.index ["archived_by_id"], name: "index_results_on_archived_by_id"
|
||||||
t.index ["created_at"], name: "index_results_on_created_at"
|
t.index ["created_at"], name: "index_results_on_created_at"
|
||||||
t.index ["discarded_at"], name: "index_results_on_discarded_at"
|
|
||||||
t.index ["last_modified_by_id"], name: "index_results_on_last_modified_by_id"
|
t.index ["last_modified_by_id"], name: "index_results_on_last_modified_by_id"
|
||||||
t.index ["my_module_id"], name: "index_results_on_my_module_id"
|
t.index ["my_module_id"], name: "index_results_on_my_module_id"
|
||||||
t.index ["restored_by_id"], name: "index_results_on_restored_by_id"
|
t.index ["restored_by_id"], name: "index_results_on_restored_by_id"
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"node-gyp": "9.3.1",
|
"node-gyp": "9.3.1",
|
||||||
"node-polyfill-webpack-plugin": "^2.0.1",
|
"node-polyfill-webpack-plugin": "^2.0.1",
|
||||||
"pdfjs-dist": "^2.5.207",
|
"pdfjs-dist": "^2.5.207",
|
||||||
"postcss": "8.4.31",
|
"postcss": "8.4.32",
|
||||||
"postcss-loader": "5.3.0",
|
"postcss-loader": "5.3.0",
|
||||||
"puppeteer": "npm:puppeteer-core",
|
"puppeteer": "npm:puppeteer-core",
|
||||||
"puppeteer-core": "^21.3.8",
|
"puppeteer-core": "^21.3.8",
|
||||||
|
|
67
yarn.lock
67
yarn.lock
|
@ -2414,11 +2414,11 @@ brace-expansion@^2.0.1:
|
||||||
balanced-match "^1.0.0"
|
balanced-match "^1.0.0"
|
||||||
|
|
||||||
braces@~3.0.2:
|
braces@~3.0.2:
|
||||||
version "3.0.2"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
||||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.0.1"
|
fill-range "^7.1.1"
|
||||||
|
|
||||||
brorand@^1.0.1, brorand@^1.1.0:
|
brorand@^1.0.1, brorand@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
|
@ -3679,10 +3679,10 @@ file-selector@^0.4.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.0.3"
|
tslib "^2.0.3"
|
||||||
|
|
||||||
fill-range@^7.0.1:
|
fill-range@^7.1.1:
|
||||||
version "7.0.1"
|
version "7.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
|
||||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
|
||||||
dependencies:
|
dependencies:
|
||||||
to-regex-range "^5.0.1"
|
to-regex-range "^5.0.1"
|
||||||
|
|
||||||
|
@ -5471,10 +5471,10 @@ nanoid@^2.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
|
||||||
integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
|
integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
|
||||||
|
|
||||||
nanoid@^3.3.4, nanoid@^3.3.6:
|
nanoid@^3.3.7:
|
||||||
version "3.3.6"
|
version "3.3.7"
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
||||||
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
|
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
|
||||||
|
|
||||||
nanoid@^4.0.0:
|
nanoid@^4.0.0:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
|
@ -6163,12 +6163,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
|
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
|
||||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||||
|
|
||||||
postcss@8.4.31:
|
postcss@8.4.32, postcss@^8.1.10, postcss@^8.4.19:
|
||||||
version "8.4.31"
|
version "8.4.32"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
|
||||||
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
|
integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.6"
|
nanoid "^3.3.7"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
source-map-js "^1.0.2"
|
source-map-js "^1.0.2"
|
||||||
|
|
||||||
|
@ -6180,24 +6180,6 @@ postcss@^7.0.1:
|
||||||
picocolors "^0.2.1"
|
picocolors "^0.2.1"
|
||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
|
|
||||||
postcss@^8.1.10:
|
|
||||||
version "8.4.26"
|
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94"
|
|
||||||
integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==
|
|
||||||
dependencies:
|
|
||||||
nanoid "^3.3.6"
|
|
||||||
picocolors "^1.0.0"
|
|
||||||
source-map-js "^1.0.2"
|
|
||||||
|
|
||||||
postcss@^8.4.19:
|
|
||||||
version "8.4.21"
|
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
|
|
||||||
integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
|
|
||||||
dependencies:
|
|
||||||
nanoid "^3.3.4"
|
|
||||||
picocolors "^1.0.0"
|
|
||||||
source-map-js "^1.0.2"
|
|
||||||
|
|
||||||
prelude-ls@~1.1.2:
|
prelude-ls@~1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||||
|
@ -6309,8 +6291,19 @@ punycode@^2.1.0, punycode@^2.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
||||||
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
|
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
|
||||||
|
|
||||||
puppeteer-core@^21.3.8, "puppeteer@npm:puppeteer-core":
|
puppeteer-core@^21.3.8:
|
||||||
name puppeteer
|
version "21.3.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.3.8.tgz#7ac4879c9f73e8426431d8ca4c58680e517a4b08"
|
||||||
|
integrity sha512-yv12E/+zZ7Lei5tJB4sUkSrsuqKibuYpYxLGbmtLUjjYIqGE5HKz9OUI2I/RFHEvF+pHi2bTbv5bWydeCGJ6Mw==
|
||||||
|
dependencies:
|
||||||
|
"@puppeteer/browsers" "1.7.1"
|
||||||
|
chromium-bidi "0.4.31"
|
||||||
|
cross-fetch "4.0.0"
|
||||||
|
debug "4.3.4"
|
||||||
|
devtools-protocol "0.0.1179426"
|
||||||
|
ws "8.14.2"
|
||||||
|
|
||||||
|
"puppeteer@npm:puppeteer-core":
|
||||||
version "21.3.8"
|
version "21.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.3.8.tgz#7ac4879c9f73e8426431d8ca4c58680e517a4b08"
|
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.3.8.tgz#7ac4879c9f73e8426431d8ca4c58680e517a4b08"
|
||||||
integrity sha512-yv12E/+zZ7Lei5tJB4sUkSrsuqKibuYpYxLGbmtLUjjYIqGE5HKz9OUI2I/RFHEvF+pHi2bTbv5bWydeCGJ6Mw==
|
integrity sha512-yv12E/+zZ7Lei5tJB4sUkSrsuqKibuYpYxLGbmtLUjjYIqGE5HKz9OUI2I/RFHEvF+pHi2bTbv5bWydeCGJ6Mw==
|
||||||
|
|
Loading…
Reference in a new issue