Skip to content

Commit 451c2a0

Browse files
Updating the MultiLinkField with get/set functions to set a maximumLinks value, updating entwine to pass that through to React and handling properly
1 parent 7613bf6 commit 451c2a0

7 files changed

Lines changed: 35 additions & 4 deletions

File tree

client/dist/js/bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/src/components/LinkField/LinkField.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const section = 'SilverStripe\\LinkField\\Controllers\\LinkFieldController';
4040
* types - types of the Link passed from LinkField entwine
4141
* actions - object of redux actions
4242
* isMulti - whether this field handles multiple links or not
43+
* maximumLinks - the maximum number of links that can be added to this field
4344
* canCreate - whether this field can create new links or not
4445
* readonly - whether this field is readonly or not
4546
* disabled - whether this field is disabled or not
@@ -54,6 +55,7 @@ const LinkField = ({
5455
types = {},
5556
actions,
5657
isMulti = false,
58+
maximumLinks = 0,
5759
canCreate,
5860
readonly,
5961
disabled,
@@ -575,6 +577,7 @@ const LinkField = ({
575577
canCreate={canCreate}
576578
readonly={readonly}
577579
disabled={disabled}
580+
exceedsMaximumLinks={!maximumLinks ? false : linkIDs.length >= maximumLinks}
578581
onSelectType={handleSelectType}
579582
dropdownToggleRef={linkPickerRef}
580583
/> }
@@ -599,6 +602,7 @@ LinkField.propTypes = {
599602
types: PropTypes.object.isRequired,
600603
actions: PropTypes.object.isRequired,
601604
isMulti: PropTypes.bool,
605+
maximumLinks: PropTypes.number,
602606
canCreate: PropTypes.bool.isRequired,
603607
readonly: PropTypes.bool.isRequired,
604608
disabled: PropTypes.bool.isRequired,

client/src/components/LinkPicker/LinkPicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const LinkPicker = ({
1616
canCreate,
1717
readonly,
1818
disabled,
19+
exceedsMaximumLinks = false,
1920
onSelectType,
2021
dropdownToggleRef,
2122
}) => {
@@ -51,9 +52,9 @@ const LinkPicker = ({
5152
const className = classnames('link-picker', 'form-control');
5253
const typeArray = Object.values(types);
5354
const allowedTypes = typeArray.filter(type => type.allowed);
54-
const message = i18n._t('LinkField.CANNOT_CREATE_LINK', 'Cannot create link');
55+
const message = exceedsMaximumLinks ? i18n._t('MultiLinkField.EXCEEDS_MAXIMUM_LINKS', 'You have reached the maximum number of links') : i18n._t('LinkField.CANNOT_CREATE_LINK', 'Cannot create link');
5556

56-
if (!canCreate || allowedTypes.length === 0 || readonly || disabled) {
57+
if (!canCreate || allowedTypes.length === 0 || readonly || disabled || exceedsMaximumLinks) {
5758
return (
5859
<div className={className}>
5960
<div className="link-picker__cannot-create">
@@ -90,6 +91,7 @@ LinkPicker.propTypes = {
9091
canCreate: PropTypes.bool.isRequired,
9192
readonly: PropTypes.bool.isRequired,
9293
disabled: PropTypes.bool.isRequired,
94+
exceedsMaximumLinks: PropTypes.bool,
9395
onSelectType: PropTypes.func.isRequired,
9496
dropdownToggleRef: PropTypes.object.isRequired,
9597
};

client/src/entwine/LinkField.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ jQuery.entwine('ss', ($) => {
6161
excludeLinkTextField: inputField.data('exclude-linktext-field'),
6262
onChange: this.handleChange.bind(this),
6363
isMulti: this.data('is-multi') ?? false,
64+
maximumLinks: this.data('maximum-links') ?? 0,
6465
types: this.data('types') ?? {},
6566
canCreate: inputField.data('can-create') ? true : false,
6667
readonly: inputField.data('readonly') ? true : false,

lang/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ en:
5959
AddLink: 'Add link'
6060
AddNewLink: 'Add new link'
6161
EditLink: 'Edit link'
62+
EXCEEDS_MAXIMUM_LINKS: 'You have reached the maximum number of links'
6263
SilverStripe\LinkField\Models\PhoneLink:
6364
LINKLABEL: 'Phone number'
6465
PHONE_FIELD: Phone

src/Form/MultiLinkField.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,27 @@
1313
*/
1414
class MultiLinkField extends AbstractLinkField
1515
{
16+
private ?int $maximumLinks = null;
17+
18+
/**
19+
* Set the maximum number of links that can be added to this field.
20+
*
21+
* @param int $maximumLinks
22+
*/
23+
public function setMaximumLinks(int $maximumLinks): static
24+
{
25+
$this->maximumLinks = $maximumLinks;
26+
return $this;
27+
}
28+
29+
/**
30+
* Get the maximum number of links that can be added to this field.
31+
*/
32+
public function getMaximumLinks(): ?int
33+
{
34+
return $this->maximumLinks ?? null;
35+
}
36+
1637
public function setValue(mixed $value, $data = null): static
1738
{
1839
// If $data is a record, we can pull the value directly from it.
@@ -38,6 +59,7 @@ public function getSchemaDataDefaults(): array
3859
{
3960
$data = parent::getSchemaDataDefaults();
4061
$data['isMulti'] = true;
62+
$data['maximumLinks'] = $this->getMaximumLinks();
4163
return $data;
4264
}
4365

@@ -52,6 +74,7 @@ protected function getDefaultAttributes(): array
5274
{
5375
$attributes = parent::getDefaultAttributes();
5476
$attributes['data-value'] = $this->getValueArray();
77+
$attributes['data-maximum-links'] = $this->getMaximumLinks();
5578
return $attributes;
5679
}
5780

templates/SilverStripe/LinkField/Form/MultiLinkField.ss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<%-- It includes some pre-rendered content to provide a nicer UI while waiting for React to boot --%>
33
<%-- Once React is done pre-rendering, it will discard the pre-rendered markup --%>
44
<input $AttributesHTML />
5-
<div data-is-multi="true" data-field-id="$ID" data-schema-component="$SchemaComponent" class="entwine-linkfield" data-types="$TypesProp">
5+
<div data-is-multi="true" data-maximum-links="$MaximumLinks" data-field-id="$ID" data-schema-component="$SchemaComponent" class="entwine-linkfield" data-types="$TypesProp">
66

77
<div class="link-field__container">
88
<% include SilverStripe/LinkField/Form/LinkField_Spinner %>

0 commit comments

Comments
 (0)