Skip to content

Instantly share code, notes, and snippets.

View vdsabev's full-sized avatar

Vlad Sabev vdsabev

View GitHub Profile
@vdsabev
vdsabev / download.js
Last active January 6, 2025 04:41
Bookmarklet - download all links on a page
javascript:(() => {
const items = document.querySelectorAll('a');
let delay = 0;
for (let index = 0; index < items.length; index++) {
const item = items[index];
item.setAttribute('download', item.getAttribute('href'));
setTimeout(() => item.click(), delay);
delay += 500;
}
})();

Keybase proof

I hereby claim:

  • I am vdsabev on github.
  • I am vdsabev (https://keybase.io/vdsabev) on keybase.
  • I have a public key ASDMrSIeb-X_-iGrkkbOejCsR3PM-JDagUCyYbk_fWi76wo

To claim this, I am signing this object:

@vdsabev
vdsabev / 01-edit-form-vague.jsx
Last active December 21, 2018 20:16
A Simple Rule for Naming Event Handlers
class EditForm extends React.Component {
state = { discardModalIsShown: false };
onSubmit = ($event) => {
$event.preventDefault();
this.setState({ discardModalIsShown: false });
this.props.onSave();
};
onClick = () => this.setState({ discardModalIsShown: true });
@vdsabev
vdsabev / 02-edit-form-meaningful.jsx
Last active December 22, 2018 20:10
A Simple Rule for Naming Event Handlers
class EditForm extends React.Component {
state = { discardModalIsShown: false };
// Previously `onClick`
showDiscardModal = () => this.setState({ discardModalIsShown: true });
// Previously `onNo` / `onClose`
hideDiscardModal = () => this.setState({ discardModalIsShown: false });
// Previously `onSubmit`
<template>
<div>
<button type="button" @click="decrement(step)">-</button>
<input type="text" :value="value" @input="setValue($event.target.value)" />
<button type="button" @click="increment(step)">+</button>
</div>
</template>
<script>
export default {
import { mount } from '@vue/test-utils';
import Counter from './Counter';
describe('Counter', () => {
let component;
beforeEach(() => {
component = mount(Counter);
});
it('should emit value set to a specific number', () => {
<template>
<div>
<button type="button" @click="decrement">-</button> <!-- we removed the argument here -->
<input type="text" :value="value" @input="setValue($event.target.value)" />
<button type="button" @click="increment">+</button> <!-- we removed the argument here -->
</div>
</template>
<script>
export default {
<template>
<div>
<button type="button" @click="decrement" aria-label="Decrement">-</button>
<input type="text" :value="value" @input="setValue($event.target.value)" />
<button type="button" @click="increment" aria-label="Increment">+</button>
</div>
</template>
<template>
<div>
<button type="button" @click="decrement">-</button>
<input type="text" :value="value" @input="setValue" /> <!-- we removed the argument here -->
<button type="button" @click="increment">+</button>
</div>
</template>
import { mount } from '@vue/test-utils';
import Counter from './Counter';
describe('Counter', () => {
let component;
beforeEach(() => {
component = mount(Counter);
});
it('should emit value set to a specific number', async () => {